개요
- CLR이라는 가상 머신에서 진행
- 압축과 세대별GC를 사용
- 압축: 가비지 콜렉션 이후 메모리 단편화를 막기 위해 메모리 빈공간 없이 당겨오는 작업
- 세대별GC: 힙영역을 세대별로 분리하여 가비지 컬렉션 범위를 효율적으로 사용(최근 세대가 오래된 세대보다 더 빈번하게 발생)
- 오래된 세대가 최근 세대쪽 메모리를 참조할 경우, 최근 세대에서 가비지 콜렉션이 일어나면 null pointer가 발생
- 이를 방지하기 위해 이러한 상황은 별도로 관리해야하는 write barrier 처리가 필요
알고리즘
- 객체 할당시 관리 힙에 추가한다.
- 그 중 0세대의 최대 용량에 도달하면 GC가 발생한다.
- 추적 참조를 하면서 참조가 0인 객체를 선별
- 해당 객체를 해제하면서, 빈 공간없게 당겨옴(재정렬)
- 살아남은 객체들을 1세대로 보내고, 0세대는 비게 됨
- 1~5를 반복하며, 만약 N세대도 최대 용량에 도달하면 0세대와 같이 GC 발생
- 최대 2세대 까지 존재하며, 최대 용량은 스스로 학습하면서 정해짐
참고문헌