1. www.oracle.com/java/technologies/javase/hotspot-garbage-collection.html
The Garbage First Garbage Collector (G1 GC)
Introduction
G1 GC는 Oracle JDK 7 update 4 릴리즈 이후부터 완전히 지원
G1 GC는 큰 메모리를 사용하는 multi-processor machine들을 위한 server-style garbage collector이다.
GC는 높은 처리량을 달성하는 동안 높은 확률로 pause time goal에 닿는다.
global marking같은 전체 heap 운영은 application thread와 동시에 수행되는데, 이것은 heap 또는 live-data size에 비례하는 중단을 예방한다.
Technical description
G1 collector는 몇몇의 기술을 통해 높은 퍼포먼스와 pause time goals을 성취한다.
heap은 동일한 크기로 분할되어 있고, 각 영역은 연속된 범위의 가상 메모리이다.
G1은 heap에 살아있는 object를 식별하기 위해 global marking 단계를 수행한다.
mark단계 성공 이후, G1은 빈곳의 region을 인지한다. G1은 첫번째로 이러한 region을 수집하고, 대개 많은 양의 여유 공간이 확보되는데, 이것이 garbage collection 방식을 Garbage First라고 부르는 이유다.
이 이름을 제안하며, G1은 garbage라 하는 회수가능한 객체로 차있는 heap의 영역을 collection하고 compaction하는데 집중한다. G1은 pause 예측 모델을 사용하고, 명시된 pause time target을 기반으로 수집할 region의 수를 선택한다.
회수를 위해 G1에게 식별된 region은 garbage collect된다. G1은 heap의 one or more region에서 single region으로 object를 복사한다. 그리고 그 과정에서 compact하고 memory를 해제한다. 이 비움은 병렬 multi-processor에서 pause time을 줄이고, 처리량을 증가시킨다. 따라서 각각의 GC와 함께 G1은 사용자가 정의한 pause time안에서 계속해서 파편화를 줄이기위해 일한다. => 이전의 두 방법을 넘어섰다.
CMS GC는 compaction하지 않고, ParallelOld GC는 전체 heap을 Compaction하지 않아 상당한 pause time을 일으킨다.
중요한 것은 G1은 실시간 collector가 아니라는 것이다. 높은 확률로 설정한 puase time target을 달성하지만, 절대적이진 않다. 이전 collection의 data에 기반하여, G1은 사용자가 구체적으로 정한 target time안에서 collect할 수 있는 region이 얼마나 많은지 추정한다. 따라서, 이 collector는 꽤 정확한 region collloct 비용 모델을 가진다. 이 모델을 이용하여 pause time target안에서 머무는 동안 얼마나 많은 region을 collect할 수 있는지 결정한다.
G1에 대한 더 많은 설정과 사용에 대한 정보는 아래 url로
www.oracle.com/java/technologies/javase/vmoptions-jsp.html
Recommended Use Cases for G1
G1의 첫번째 초점은 유저에게 제한된 GC latency로 large heap이 필요한 어플리케이션을 실행하는 사용자에게 솔루션을 제공한다는 것이다. 6GB이상의 heap size를 의미하며, 0.5초 이하의 안정적이고 예측 가능한 pause time을 의미한다.
실행중인 응용 프로그램은 만약 다음 특성 중 하나 이상에 해당하는 경우 CMS 또는 ParallelOld GC는 G1으로 전환하는게 이득이 된다.
* Java heap의 50%이상을 live data가 사용 중인 경우
* 할당된 object 비율과 승급된 비율이 크게 다른 경우
* 원하지 않는 GC 또는 0.5나 1초 이상의 긴 pause의 경우
Future
G1은 장기적으로 CMS Collector를 대체할 계획이다. G1과 CMS를 비교해보면, G1은 더 좋은 솔루션을 만드는 차이점이 있다. 한가지 차이점은 G1은 compacting collector라는 것이다. G1은 할당을 위해 세분화된 free list를 사용하지 않도록 충분히 압축하고, 대신 region에 의존한다. 이렇게 하면 collector의 부가 상당히 단순화되고, 대부분 잠재적인 파편화 이슈가 제거된다. 또, G1은 CMS collector보다 더 예측 가능한 GC pause를 제공하며, 사용자가 바라는 구체적인 pause target을 정할 수 있다.
G1은 논리적 의미에서 generational이다. 빈 영역의 집합은 logical young generation.
young generation은 light blue.
할당은 logical young generation에서 이루어진다.
logica young generation이 가득차면, 해당 지역은 GC된다.
mixed collection : young region의 밖의 영역(old regions in dark blue)이 동시에 GC되는 현상
GC는 선택된 live object들을 빈 reigons에 copy한다.
위의 사진에서 collecte된 region은 red로 마킹되어있다.
위 사진은 young region과 old region이 함께 collect되니까 mixed collection을 나타낸다.
살아남은 object의 수명에 기반하여 object는 servivor region(S)이나 old region에 복사될 수 있다.
Allocation Failure
G1 collector는 CMS와 마찬가지로 응용 프로그램이 실행되는 동안 collection의 일부를 실행한다. garbage collector가 사용가능한 공간을 만드는 것보다 빠르게 객체를 할당할 위험이 있다.
G1은 한 region에서 다른 region으로 live data를 복사하는 동안 Java heap 고갈같은 실패가 발생한다. 복사는 live data를 compact하기위해 수행된다. 할당 실패시에는 STW 발생한다.
Floating Garbage
객체는 G1 collection 중 죽을 수 있다. G1은 SATB(snapshot-at-the-beginning) 알고리즘을 사용하여 garbage collector가 모든 live object를 찾을 수 있도록 한다. SATB는 CMS와 유사한 방식으로 floating garbage를 허용한다.
Pauses
G1은 응용 프로그램을 puase하여 live object를 새로운 region에 복사한다. 이런 puase에는 young collection pause 또는 mixed collection pause가 있다.
CMS에는 initial marking pause가 있다. G1은 initial marking을 evacuation pause로 수행한다.
G1은 컬렉션의 끝에 부분적으로 STW이고 부분적으로 동시 인 정리 단계가 있습니다. 정리 단계의 STW 부분은 빈 영역을 식별하고 다음 컬렉션의 후보 인 이전 영역을 결정합니다.
Card Tables and Concurrent Phases
garbage collector가 전체 heap을 collect하지 않는 경우, garbage collector는 collect 되지 않는 부분에서 collect 되는 heap 부분으로 포인터가 있는(참조되는) 위치를 알아야한다.
collect 되지 않는 부분은 old generation
collect되는 부분운 young generation
old generation이 young generation을 참조하는게 card table이다. Java HotSpot VM은 byte배열을 카드 테이블로 사용한다. 각 byte를 카드라고 부른다. 카드는 heap 주소 범위에 해당한다. 더티카드는
byte값을 dirty value로 변경하는 것이다. dirty value는
카드를 처리한다'의 의미는 카드를 보고 young generation을 참조하는 old generation이 있는지 확인하고 해당 정보를 다른 data structure로 전송하는 것과 같은 작업을 수행하는 것을 의미한다.
G1에는 응용 프로그램에서 찾은 live object를 찾음과 동시에 marking 하는 단계가 있다. 동시 마킹은 evacuation pause에서 remark까지 확장된다. 동시에 cleanup 단계에서는 비워진 region을 사용 가능한 region 목록에 추가하고, remembered sets에서 지운다. 더불어 concurrent refinement thread(동시 구체화 쓰레드)가 필요에 따라 실행되어 응용 프로그램 쓰기에 의해 더럽혀지고, 교차 region 참조가 있을 수 있는 카드 테이블 항목을 처리한다.
Starting a Concurrent Collection Cycle
young region과 old region 둘 다 garbage collect 되는 것은 mixed collection이다. old region을 collect하기 위해 G1은 heap의 live object를 완전히 marking한다. 이런 marking은 concurrent marking 단계에서 진행된다. concurrent marking단계는 Java heap의 점유율이 InitiatingHeapOccupancyPercent 값에 도달하면 수행된다. InitiatingHeapOccupancyPercent의 설정은 --XX:InitiatingHeapOccupancyPercent=<NN>로 한다.
Pause Time Goal
MaxGCPauseMillis flag로 G1의 pause time 목표를 설정할 수 있다. G1은 예측 모델을 사용하여 목표 pause time내에 수행할 수 있는 GC의 양을 설정한다. collection이 끝나면, G1은 collect할 다른 collection을 선택한다. collection set에는 young regions이 포함된다. G1이 GC의 pause time의 길이를 제어하는 것은 부분적으로 collection set에서 young region의 수를 선택하는 것이다. 다른 garbage collector와 마찬가지로 명령줄에서 young region의 크기를 지정할 수 있지만, 그렇게 하면 G1이 목표 pause time 시간을 달성하는데 방해가 될 수 있다. pause time 목표 외에도 pause time이 발생하는 기간의 길이를 지정할 수 있다. pause time 목표를 GCPauseIntervalMillis로 최소 mutator 사용량을 지정할 수 있다. MaxGCPauseMillis의 기본값은 200 밀리세컨드이다. GCPauseIntervalMillis(0)의 기본값은 시간 범위에 대한 요구사항이 없는 것과 같다.
'개발 > Java' 카테고리의 다른 글
Java] ExecutorService란? (0) | 2021.04.12 |
---|---|
정규표현식 (0) | 2020.08.18 |
Java] Do it 자바 프로그래밍 입문 요약 (셋째마당 - 12) (0) | 2019.06.18 |
Java] Do it 자바 프로그래밍 입문 요약 (셋째마당 - 11) (0) | 2019.06.18 |
Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 10) (0) | 2019.06.18 |