G1GC ( Garbage First ) GC
G1GC 소개
G1 Garbage Collector 는 믄 메모리를 사용하는 멀티 프레서서 머신을 타겟으로 하는 GC 이다. 최소한의 설정으로 높은 처리량과 짧은 "pause-time" 목표를 달성하고자 한다. G1 GC는 아래 특징들을 가진 응용프로그램과 환경에서 처리 속도와 처리량간의 최고의 균형을 제공하도록 돕는다.
- 힙 사이즈가 10GB 이상이면서 사용중인 데이터가 힙의 50퍼센트 이상을 차지
- 객체 할당과 Promotion의 비율이 시간이 지남에 따라 크게 달리짐
- 힙 안에서 많은 파편화
- 수백 millisecond 이하의 "pause-time"이 목표
G1GC 는 Concurrent Mark-Sweep(CMS) Collector 를 대체한다.
G1GC 는 아래 내용들로 높은 성능과 짧은 "pause-time"을 얻을 수 있었다.
기본 개념
G1GC 는 다른 GC 들과 마찬가지로 가상의 Young 과 Old Generation 을 나눈다. G1GC 의 공간회수는 가장 효과적으로 Garbage Collecting 할 수 있는 Young Generation 에 집중한다. 때문에 Old generation 의 공간회수는 드물게 일어난다.
어떤 기능은 성능을 향상하기 위하여 Stop The World 로 인한 "pause time" 에만 수행된다. 하지만 Global Marking 과 같은 힙 영역 전체를 대상으로 하는 기능들은 Stop The World 로 수행하게 되면 더 많은 시간이 소요된다. 때문에 이런 기능들은 응용프로그램과 병렬적으로 수행된다. 공간회수를 위한 Stop The World 시간을 줄이기 위하여, G1GC 는 병렬적으로, 단계적으로 공간회수를 실행한다. G1은 "pause time" 과 관련된 비용 모델을 만들기 위하여 예측 가능한 정보들을 가지고 있는다. 이 정보들은 Pause 되어 있는 시간 동안 수행되어야 하는 일의 크기를 예측한다. 예를들어 G1GC 는 가장 효율적인 공간의 회수를 먼저 실행한다.
G1 은 "evacuation" 을 이용하여 공간을 회수한다. "Evacuation" 이란 공간 회수를 위하여 선택된 메모리 지역에 살아있는 객체들은 해당 공간의 압축을 위하여 새로운 메모리 공간으로 복사된다. "Evacuation" 이 완료되면, 해당 공간은 응용프로그램에 의해서 다른 객체가 할당되어 사용된다.
G1GC 는 실시간 Collector가 아니다. G1GC는 긴 시간동안 목표로 하는 "pause time" 을 충족시키려고 하지만 절대적으로 만족시키는 것이 보장되지는 않는다.
힙 레이아웃
G1 은 힙을 동일한 크기 조각 집합으로 나눈다. 각 조각은 메모리 할당과 회수의 단위이다. 언제든지 이 조각들은 빌(회색) 수 있고 Young 또는 Old Generation 에 할당 될 수 있다. 메모리 할당이 필요하다는 요청이 있을때 메모리 관리자는 빈 조각을 제공한다. 메모리 관리자는 빈 조각들을 특정 Generation 에게 할당한다 그리고 응용프로그램에게 조각을 제공하여 객체를 할당할 수 있도록 한다.
Young Generation 은 Eden(빨강) 영역과 Survivor(빨강 S) 영역을 포함한다. 이 조각난 G1GC의 Young Generation은 다른 Garbage Collector 의 연속된 Young Generation 과 같은 기능을 제공한다. 파란색 조각들은 Old Generation 을 위한 공간이다. Old Generation 조각( 파란색 H ) 들은 여러개의 조각들을 포함한 거대한 조각일 수 있다.
응용프로그램은 항상 Eden 조각에 객체를 할당하지만 매우 큰 객체의 경우에는 바로 Old Generation 에 할당한다.
G1GC "pause" 동안에는 Young generation 전체의 공간 회수를 할 수 있을 뿐만 아니라 다른 Collector 의 "pause" 와 마찬가지로 Old Generation 조각의 회수도 할 수 있다. "pause" 동안 G1GC 는 Collection 세트 안에 있는 객체를 하나 이상의 조각들로 복사한다. 이 객체들의 목표 조각은 GC 전에 해당 객체가 어느 조각에 포함되어있었는지에 따라 달라진다. Young Generation 전체는 Survivor 영역 또는 Old 영역으로 복사되고 Old 영역에 있었던 객체들은 Aging 과 함께 다른 Old 영역으로 복사된다.
Garbage Collection 싸이클
G1GC 는 두단계로 크게 나눌 수 있다. "Young Only" 단계는 현재 가용한 메모리 공간을 Old Generation 의 객체들로 채우는 과정을 포함한다. "Space Recalmation" 단계에서 G1GC 는 Old Generation 의 공간을 회수하며 더하여 Young Generation 도 다룬다.
1. Young Only 단계
이 단계는 Young Generation 의 객체들 중에 Old Generation 으로 "promote" 가 필요한 객체들을 수집하는것으로 시작한다. Old Generation 에 설정되어 있는 Heap Occupancy Threshold 에 도달하게 되면 "Young Only" 단계와 "Space Reclamation" 단계 사이에서 이 이동이 시작한다. 이때 G1은 일반적인 Young Collection 대신에 Concurrent Start Young collection 을 수행한다.
- Concurrent Start : 이 단계에서 GC 는 일반적인 Young Collection 을 할 뿐만 아니라 Marking process 도 병행한다. Concurrent Marking 은 다음에 이어질 공간 회수 단계를 위하여 Old Generation 으로 부터 현재 참조가 살아있는 객체들을 결정한다. Concurrent Marking 이 끝나지 않았다 하더라도 Normal Young Collection 은 발생할 수 있다. Marking 은 두개의 특별한 Stop The World 와 함께 끝난다 : Remark, Cleanup
- Remark : 이 "pause" 는 Marking 을 최종화하고, 글로벌 참조 처리와 클래스 언로딩을 수행하며, 완전히 빈 영역을 회수하고 내부 데이터 구조를 정리한다. Remark 와 Cleanup 사이에 G1 은 Cleanup 단계에서 최종화될 선택된 Old Generation 의 빈 공간을 계산한다.
- Cleanup : 이 "pause" 에서 "Space Reclamation" 이 발생할지 말지를 결정한다. 만약 "Space Reclamation" 이 수행된다면, "Young Only" 단계는 "Prepare Mixed Young Collection" 과 함께 끝난다.
2. Space Reclamation 단계 : 이 단계에서는 multiple Mixed Collection 로 구성된다. multiple Mixed Collection 은 Young Generation 조각뿐만 아니라 Old Geneation 조각에 대한 "evacuate" 한다. "Space Reclamation" 단계는 G1 이 들이는 노력에 비해서 얻을 수 있는 빈 공간이 충분하지 않다고 판단할때 종료된다.
"Space Reclamation" 후에 GC 는 "Young Only" 단계부터 다시 시작한다. 만약 응용프로그램이 모든 메모리를 사용한다면 다른 GC 들과 마찬가지로 Full GC 가 수행된다.