Java 7 의 G1 메모리 관리자 (Garbage First Garbage Collector, 이하 G1GC)
(JDK 1.6 update 14 에 포함됨)
이전의 Garbage Collector 처럼 동일한 영역을 사용하지만 고정된 크기가 아니며 유연성을 제공.
G1 은 CMS 컬렉터와 유사한 방식으로 동작하며 객체의 유효화를 결정하는 동시에 마킹 단계를 수행하며,
마킹 단계를 완료하고 나면 대부분의 비어있는 영역을 알고 있음.
=> 바둑판 영역에 메모리를 할당하고 GC 를 실행하는데 해당영역이 꽉차게 되면 다른 빈 영역에 메모리를 할당하는 방식
* 목적 : 멀티 프로세서 머신에서 동작하는 대규모 업무용 어플리케이션을 위한 것.
기본적으로 2G 이상의 Heap을 사용하는 크리티컬한 어플리케이션에서는 Full GC 수행 시에
스레드가 수십 초간 멈추는 한계를 보였는데 이를 극소화 했다는 거라 함.
기존의 CMS GC 를 대체할 목적으로 만들어졌으며 몇가지 기능을 동시에 지원함.
다시 말하자면, 기존에 CMS (Concurrent mark and sweep)과 는 다르게 Compaction을 사용하며,
Large Memory에서 latency time을 극소화 했다는 것임.
즉, GC 시간 때문에 대용량 Heap을 사용하지 못하는 일이 없어진다는 것!
* 장점
1) 긴 GC 에 의한 pause time 이 없는 compact 한 빈공간
2) GC 의 pause time 예측 가능
3) 처리 성능을 저하시키지 않음 (처리 성능 향상)
4) Java Heap 을 많이 사용하지 않음
* Full GC
1) Initial Mark
2) Root Region Scan
3) Concurrent Mark
4) Remark
5) Clean Up
6) Copy
CMS와 같이 일부 구간은 STW된다. (Initial Mark, Remark, Copy)
* 적용 방법
1) JDK 1.6 (1.6.0_14 이후) : 사용가능하나, 1.7.0_4 이후에 사용하는 것이 안정적이라는 것 같음.
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
2) JDK 1.7 (1.7.0_4)
-XX:+UseG1GC
#) GC 의 pause time 과 pause interval 을 조절
-XX:MaxGCPauseMills=50 (for a pause time target of 50ms)
-XX:GCPauseintervalMillis=200 (for a pause interval target of 200ms)
아직까지는 실 사례를 보지는 못했음. 과연 위의 장점들을 체감할 수 있을까!?...
* 참고 URL : http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html#overview