참고 사이트 : https://learn.microsoft.com/ko-kr/dotnet/standard/garbage-collection/fundamentals
*관리되는 힙(Managed Heap)에 참조 타입(객체 등)이 순차적으로 할당된다.
힙에 객체를 할당할 때는 단순히 포인터 값을 증가시키는 방식으로 빠르게 할당한다.
할당 속도가 스택 할당과 비슷할 정도로 빠르다.
새 객체들은 메모리상 인접하게 저장되어 빠르게 액세스가 가능하다.
*관리되는 힙 : 새 프로세스를 시작할 때 런타임에서 예약한 주소공간
가비지 수집기(GC)가 더 이상 사용되지 않는 객체의 메모리를 해제한다.
애플리케이션의 루트(정적 필드, 스택의 지역 변수, CPU 레지스터 등)에서 접근 불가능한 객체를 "가비지"로 간주한다.
가비지 객체가 많을 때는 남은 유효 객체들을 압축해서 메모리 공간을 최적화한다.
압축이 필요 없으면 객체들의 위치는 그대로 유지된다.
큰 객체(85,000바이트 이상)는 별도의 "대형 개체 힙(LOH)"에 할당되며, 일반적으로 이동/압축되지 않는다.
시스템 메모리가 부족할 때
할당된 힙의 메모리가 임계값을 초과할 때 (이 임계값은 자동 조정됨)
GC.Collect() 메서드가 호출될 때 (직접 호출하는 경우는 거의 없다.)
프로세스마다 하나의 관리되는 힙을 사용하며, 프로세스의 모든 스레드는 이 힙을 공유한다.
관리되는 힙은 OS의 네이티브 힙과 대조된다.
힙의 세그먼트 크기는 구현에 따라 다르므로, 특정 크기에 의존해서는 안 된다.
*네이티브 힙 : 운영체제에서 직접 관리하는 메모리 영역으로 'C' 나 'C++'에서
malloc,free와 같은 함수를 써서 수동으로 관리하는 메모리 공간이다.