[Java] Garbage Collector 내부 구조
힙 영역의 구조
- eden
- survivor1
- survivor2
- old
- permanent
Minor GC
eden 영역에서 old 영역 방향으로 오랫동안 참조되고 있는 메모리를 복사를 통해서 보존합니다. 가장 GC가 많이 일어나는 공간은 eden 영역입니다.
- 최초에 객체가 생성되면 Eden영역에 생성된다.
- Eden영역에 객체가 가득차게 되면 첫 번째 CG가 일어난다.
- survivor1 영역에 Eden영역의 메모리를 그대로 복사된다. 그리고 survivor1 영역을 제외한 다른 영역의 객체를 제거한다.
- Eden영역도 가득차고 survivor1영역도 가득차게된다면, Eden영역에 생성된 객체와 survivor1영역에 생성된 객체 중에 참조되고 있는 객체가 있는지 검사한다.
- 참조 되고있지 않은 객체는 내버려두고 참조되고 있는 객체만 survivor2영역에 복사한다.
- survivor2영역을 제외한 다른 영역의 객체들을 제거한다.
- 위의 과정중에 일정 횟수이상 참조되고 있는 객체들을 survivor2에서 Old영역으로 이동시킨다.
- 위 과정을 계속 반복, survivor2영역까지 꽉차기 전에 계속해서 Old로 비움
Major GC
Minor GC보다 시간이 훨씬 많이 걸리고 실행중에 GC를 제외한 모든 쓰레드가 중지한다.
- Old 영역에 있는 모든 객체들을 검사하며 참조되고 있는지 확인한다.
- 참조되지 않은 객체들을 모아 한 번에 제거한다.
Old영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거하게 된다. 그러면서 Heap 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간)이 생기는데 이 부분을 없애기 위해 재구성을 하게 된다. (디스크 조각모음처럼 조각난 메모리를 정리함) 따라서 메모리를 옮기고 있는데 다른 쓰레드가 메모리를 사용해버리면 안되기 때문에 모든 쓰레드가 정지하게 되는 것이다.