[C#] GC (Garbage Collector)

oy Hong·2024년 4월 9일

기술

목록 보기
4/23

GC


  • 동적으로 할당된 메모리를 관리해준다.
  • GC가 관리하는 힙 영역을 관리 힙 (managed heap) 이라고 한다.

Garbage란 무엇인가?

힙 메모리의 데이터에 더 이상 접근할 수 없어 참조할 수 없게 된 객체를 garbage라고 부른다.


Generation (세대)

  1. 새로 힙 메모리에 할당되는 객체의 경우 0세대에 저장한다.
  2. 0세대가 꽉차게 되면 가비지 컬렉션이 일어난다.
  3. 사용 되고 있는 객체들은 1세대에 저장된다.
  4. 1세대가 꽉차게 되면 가비지 컬렉션이 일어난다.
  5. 사용 되고 있는 객체들은 2세대에 저장된다.
  6. 2세대로 옮겨진 객체들은 더 이상 다른 세대로 옮겨가지 않는다.

Full GC

2세대까지 꽉차서 가비지 컬렉션이 수행된다면 가비지 컬렉터는 모든 세대에 대해 가비지 컬렉션을 진행한다.
이것을 Full GC라고 부르는데 이때 일정 시간 프로그램을 멈추고 가비지 컬렉션을 진행한다.

프로그램이 차지한 메모리가 크면 클수록 그 시간은 더 길어진다.


Garbage Collection 과정

  1. 사용되고 있는 개체들을 연결하는 작업 (Mark)
  2. 사용되지 않는 개체들을 식별하는 작업 (Relocate)
  3. 필요 없는 객체들을 지우고 살아있는 객체들을 모으는 작업 (Compact)

Marking 단계 (표시 단계)

가비지 컬렉션 주기가 시작될 때 가비지 콜렉터는 일단 모든 객체를 가비지로 가정한다. 이 상태에서 가비지 컬렉터는 루트 목록을 돌면서 각 루트가 참조하는 것들을 마킹한다.

루트에서 연결될 수 있는 객체를 도달할 수 있는 객체라 부른다.

Relocating 단계 (재배치 단계)

루트 목록에서 도달할 수 없는 객체들을 가비지로 간주한다. 가비지가 차지한 공간은 비어 있는 공간으로 간주하게 된다.

Compacting 단계 (압축 단계)

루트 목록에 대한 조사가 끝나면 가비지 컬렉터는 힙을 순회하며 비어있는 공간에 메모리 복사를 통해 도달할 수 잇는 객체들을 덮어 씌운다.

메모리 단편화

  • 메모리 할당과 해제가 반복되는 과정에서 메모리 단편화가 일어나는데, 이는 할당 속도를 느리게하는 원인이 된다.
  • 이를 해결하기 위해 Compacting 단계에서, 필요한 경우 객체의 주소를 당겨서 빈 메모리 공간을 연속적으로 채운다.

대용량 객체 힙(Large Object Heap, LOH)

CLR은 일정 크기 이상의 객체는 별도의 힙 영역에 할당하는데 이를 대용량 객체 힙(Large Object Heap, LOH)이라고 한다.

대형 객체의 경우 잡아먹는 공간 자체가 크기 때문에 더욱 빠르게 메모리를 가득 채우게 될 것이고, 이는 가비지 컬렉션을 훨씬 빈번하게 일으키게 된다. 따라서 .Net에서는 이러한 대형 개체들을 대용량 객체 힙에 관리한다.

0개의 댓글