GC는 크게 마이너 GC
와 메이저 GC
두가지 타입으로 나뉜다.
두 가지 GC가 어떻게 상호 작용하는지에 따라 GC 방식에 차이가 나며,
성능에 영향을 준다
마이너 GC : Young 영역에서 발생하는 GC
메이저 GC : Old 영역이나 Perm 영역에서 발생하는 GC
TLABs (Thread-Local Allocation Buffers : 스레드 로컬 할당 버퍼)
JDK 5.0 이상에서 지원하는 GC에는 5가지 방식이 존재한다.
- Serial Collector
- Parallel Collector (Throughput Collector)
- CMS Collector (Concurrent Mark-Sweep Collector)
- G1 Collector (Garbage First Collector)
- Z Garbage Collector
Young 영역과 Old 영역이 연속적(serial)으로 처리되며 하나의 CPU를 사용한다.
메모리가 적고, CPU 코어 개수가 적을 때 적합한 GC 방식이다.
Minor GC 뿐 아니라 Major GC인 경우도 올스탑(stop-the-world)한다.
Old 영역의 GC는 mark-sweep-compact 알고리즘을 사용한다
- mark : Old 영역에 살아 있는 객체를 식별하여 표시해 놓는다
- sweep : heap의 앞부분 부터 확인하여 살아있는 객체만 남긴다
- compact : 각 객체들이 연속되게 쌓이도록 가장 앞 부분부터 채워서 객제가 존재하는 부분과 없는 부분으로 나눈다
Serial GC와 기본적인 알고리즘은 같으나, Parallel GC는 GC를 처리하는 쓰레드가 여러 개다.
메모리가 충분하고 코어의 개수가 많을 때 적합한 GC 방식이다.
MinorGC 뿐 아니라 Major GC인 경우도 올스탑(stop-the-world)한다.
Old 영역의 GC는 mark-sweep-compact 알고리즘을 사용한다
2개 이상의 CPU를 사용하는 서버에 적합한 GC 방식이다.
4단계를 따른다
- Initial Mark 단계 : class loader에서 가장 가까운 객체 중 살아 있는 객체만 찾는다 (mark)
- Concurrent Mark 단계 : 올스탑(stop-the-world)없이 살아있다고 확인한 객체에서 참조하고 있는 객체를 확인한다
- Remark 단계 : Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인한다
- Concurrent Sweep 단계 : 올스탑(stop-the-world)없이 참조 되지 않는 객체를 정리한다
바둑판의 각 region(영역)에 객체를 할당하고 GC를 실행한다. 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행한다.
CMS Collector의 CPU리소스 및 메모리 파편화의 단점을 해결하기 위해 만들어진 방식이다.
G1 Collector의 가장 큰 장점은 어떤 GC 방식보다도 빠르다는 점이다.
Young의 세가지 영역 (Eden 영역, 2개의 Survivor 영역)에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식이다.
JDK 6에서는 early access라고 부르며 시험삼아 사용할 수 있고, JDK 7에서 정식으로 사용 가능한 방식이다.
기능
성능