[C#] 가비지 컬렉터 (2)

Flaming Bun·2025년 7월 9일

C#

목록 보기
27/35

참고 사이트 : 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와 같은 함수를 써서 수동으로 관리하는 메모리 공간이다.

0개의 댓글