허원철의 개발 블로그

Java - Garbage First(G1) Garbage Collection 본문

java

Java - Garbage First(G1) Garbage Collection

허원철 2017. 3. 12. 21:54

이번 글은 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 정보에 계산됩니다.

 ③ Remark
 - 빈 영역이 제거되고 교정됩니다. 현재 모든 region에 대해 region liveness이 계산됩니다.

  Copying/Cleanup
 - liveness가 가장 낮은 region이 선택되어 가장 빠르게 수집 됩니다. region은 Young Collection과 동시에 수집됩니다. 

 ⑤ After Copying/Cleanup
 - 선택된 영역이 수집되고 압축됩니다.
 

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

- http://initproc.tistory.com/50

'java' 카테고리의 다른 글

Google - Guava  (423) 2017.04.06
Thread Pool 이해하기  (401) 2017.04.01
Java - JVM Architecture  (429) 2017.03.08
Java - Compare GC  (406) 2017.03.07
Java - GC (Garbage Collection)  (420) 2017.03.05
Comments