Java G1(Garbage First) GC란?

wannabeking·2022년 10월 24일
0

Java

목록 보기
7/13
post-thumbnail

Java 8의 default GC는 Parallel GC로 Young Generation의 GC를 멀티 스레드로 수행하여 stop-the-world 시간을 단축 시켰다.

Java 9+는 default GC로 G1(Garbage First) GC를 사용한다.

어떠한 방법으로 성능 개선이 이루어 졌는지, G1 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 순서로 진행된다.

각 과정의 설명은 다음과 같다.

  • Initial Mark
    • stop-the-world 발생
    • Old region의 객체들이 참조하는 Survivor region 객체들을 찾는다.
  • Root Region Scan
    • Initial Mark 단계에서 찾은 객체들 중에서 GC 대상인 객체들을 스캔한다.
  • Concurrent Mark
    • 모든 region에 대해 스캔을 진행하고, GC 대상 객체가 발견되지 않은 region은 이후 과정에서 제외한다.
  • Remark
    • stop-the-world 발생
    • 변경 사항에 따라 최종적으로 GC 대상이 아닌 객체들을 식별한다.
  • Cleanup
    • stop-the-world 발생
    • GC 대상 객체들이 많은 region에 대한 메모리 해제를 수행한다. stop-the-world 종료 후 완전히 비워진 region 을 free region list에 추가한다.
  • Copy
    • GC 대상 region이었지만 Cleanup 과정에서 완전히 비워지지 않은 region의 살아남은 객체들을 새로운 Available/Unused region 에 복사하여 압축 작업을 수행한다.


profile
내일은 개발왕 😎

0개의 댓글