Java - Garbage First(G1) Garbage Collection
이번 글은 Garbage First(이하 G1) Garbage Collection에 대한 글 입니다.
간단한 소개
1) JDK 7 update 4 및 이후 Release에서 완전히 지원합니다.
2) 대용량 메모리가 있는 다중 프로세서를 대상으로한 서버 스타일 GC입니다.
3) GC Thread와 Application Thread와 동시에 수행합니다.
Heap Structure
- Heap 영역을 동일 크기로 분할합니다. (region이라고 칭합니다.)
- 1~32MB 정도로 나누고 있으며, 약 2000개 region이 생깁니다.
- region은 기존에 영역인 eden, survivor, old 중 하나 일 수 있습니다.
Heap Allocation
- G1은 Heap 영역들에서 비어있는 region을 파악하고 수집합니다. 그렇기 때문에 많은 양의 여유 공간이 생깁니다.
- 하나 이상의 region에서 단일 region으로 객체를 복사하고 프로세스 과정에서 압축하여 메모리를 비웁니다. 이는 병렬로 수행되기 때문에 처리량을 줄일 수 있고, STW을 줄일 수 있습니다.
- Humongous Region, Available/Unused Region이 새로 생겼습니다.
① Humongous Region : 객체가 큰 경우 사용됩니다. (일반 객체보다 30~50% 큰 경우에 해당됩니다.)
② Available/Unused Region : 아직 사용하지 않은 영역입니다.
- 추가로, Heap 6GB이상을 권장하고 있습니다.
※ G1이 필요한 경우
① Heap의 50% 이상이 실시간 데이터로 가득 찬 경우
② 객체 할당 비율이나 프로모션의 속도가 크게 다른 경우
③ GC 수집이 긴 경우
GC Process
1) Young GC
- Live Object는 하나 이상의 survivor region에 복사 또는 이동됩니다.
- Aging Threshold이 충족되면, old region으로 승격됩니다. (STW 발생)
2) Old GC
- 일부분 Young GC이 포함되어 있습니다.
① Initial Mark
- Young GC에서 Live Object의 초기 마킹을 피기백합니다.
② Concurrent Marking
- 빈 region(Live Object가 없는 것을 뜻하는 듯..?)이 발견되면, Remark 단계에서 즉시 제거 됩니다. 또한 liveness를 결정하는 accounting 정보에 계산됩니다.
Old GC KeyPoint
1) Concurrent Marking
- liveness 정보는 Application이 실행되는 동안 계산됩니다.
- liveness 정보는 Ebacuation 단계 중에 가장 좋은 region을 식별합니다.
- CMS와 같은 단계는 없습니다.
2) Remark
- CMS에서 사용된 알고리즘보다 훨씬 빠른 SATB 알고리즘을 사용합니다.
- 완전히 빈 지역은 제거됩니다.
3) Copying/Cleanup
- Young GC와 Old GC가 동시에 진행됩니다.
- Old GC는 liveness에 의애 선택됩니다.
참고
- http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html