Java 8의 default GC는 Parallel GC로 Young Generation의 GC를 멀티 스레드로 수행하여 stop-the-world 시간을 단축 시켰다.
Java 9+는 default GC로 G1(Garbage First) GC를 사용한다.
어떠한 방법으로 성능 개선이 이루어 졌는지, G1 GC를 탐구해보자 한다.
G1 GC의 Heap 영역은 전통적인 GC와 다르다.
전통적인 GC가 Heap 영역을 물리적으로 분리하여 사용했다면, G1 GC는 일정 크기의 region으로 구분하여 논리적으로 분리한다.
G1 GC에는 Eden, Survivor, Old 외 추가적으로 Humongous region이 존재하는데, region 크기의 50%가 넘는 객체를 위한 region이다.
Available / Unused region은 비어있는 region을 일컫는다.
G1 GC에서 Full GC의 동작 과정은 Initial Mark
-> Root Region Scan
-> Concurrent Mark
-> Remark
-> Cleanup
-> Copy
순서로 진행된다.
각 과정의 설명은 다음과 같다.