힙 메모리의 데이터에 더 이상 접근할 수 없어 참조할 수 없게 된 객체를 garbage라고 부른다.
2세대까지 꽉차서 가비지 컬렉션이 수행된다면 가비지 컬렉터는 모든 세대에 대해 가비지 컬렉션을 진행한다.
이것을 Full GC라고 부르는데 이때 일정 시간 프로그램을 멈추고 가비지 컬렉션을 진행한다.
프로그램이 차지한 메모리가 크면 클수록 그 시간은 더 길어진다.
가비지 컬렉션 주기가 시작될 때 가비지 콜렉터는 일단 모든 객체를 가비지로 가정한다. 이 상태에서 가비지 컬렉터는 루트 목록을 돌면서 각 루트가 참조하는 것들을 마킹한다.
루트에서 연결될 수 있는 객체를 도달할 수 있는 객체라 부른다.
루트 목록에서 도달할 수 없는 객체들을 가비지로 간주한다. 가비지가 차지한 공간은 비어 있는 공간으로 간주하게 된다.
루트 목록에 대한 조사가 끝나면 가비지 컬렉터는 힙을 순회하며 비어있는 공간에 메모리 복사를 통해 도달할 수 잇는 객체들을 덮어 씌운다.
CLR은 일정 크기 이상의 객체는 별도의 힙 영역에 할당하는데 이를 대용량 객체 힙(Large Object Heap, LOH)이라고 한다.
대형 객체의 경우 잡아먹는 공간 자체가 크기 때문에 더욱 빠르게 메모리를 가득 채우게 될 것이고, 이는 가비지 컬렉션을 훨씬 빈번하게 일으키게 된다. 따라서 .Net에서는 이러한 대형 개체들을 대용량 객체 힙에 관리한다.