[Java] G1GC (Garbage First Garbage Collector)

DaeHoon·2024년 1월 28일

G1GC

이전의 GC는 Young Generation, Old Generation 영역이 고정적었다. 하지만 G1 GC는 고정된 영역이 아닌 전체적인 heap 메모리를 논리적인 단위로 리전을 분리한다

  • 큰 메모리를 가진 멀티 프로세서 시스템에서 사용하기 위해 개발된 가비지 컬렉터이다.
  • 사용하지 않는 개체의 영역을 수집하고 압축하여 Stop The World를 최소화하였다
  • G1은 실시간 가비지 컬렉터가 아니다. 일시 정지시간을 최소화하되 완전히 없애지는 못한다.
  • G1은 Java 9부터 디폴트 GC이다.
  • G1은 통계를 계산해가면서 GC 작업량을 조절한다.

Heap Layout

G1 GC는 힙 영역을 같은 크기의 region으로 나누고 관리한다. 나눠져서 관리되는 region은 메모리 회수와 할당의 단위가 된다. region 마다 다른 색깔을 띄고 있는데 각각은 다음과 같은 의미를 가지고 있다.

  • 빨강색 : Young 영역(Eden)
  • 빨강색 + S : Young 영역 (Survivor)
  • 파랑색 : Old 영역
  • 파랑색 + H : Old 영역 (여러 개의 region이 필요한 사이즈가 큰 객체(humongous object)
  • 회색 : 비어있는 부분들. 즉, 언제든지 할당가능한 영역

Garbage Collection Cycle

  • Young-only 단계
    • Concurrent Start
      • 이 단계에서 Young GC를 수행하면서 동시에 Marking Phase가 진행된다.
      • Concurrent Start Old Region을 GC하기 위해 현재 도달할 수 있는 live 객체(Object)를 결정한다.
      • Concurrent Mark가 진행되는 도중에, Young GC가 동작할 수 있으며 이로 인해 방해받을 수 있다.
      • Marking은 Remark 와 Cleanup 단계에서 STW를 발생시킬 수 있다.
    • Remark
      • Marking을 마무리하고 Reference 처리 및 Class Unloading을 수행하여 Empty Region을 회수하고 내부 데이터 구조를 정리
      • Remark와 Cleanup 사이에서 G1은 Old Region에서 여유 공간을 회수 할 수 있도록 정보를 계산한다.
      • 이 계산은 Cleanup 단계에서의 STW에서 마무리 된다.
    • Cleanup
      • Region 회수가 실제로 진행될지 결정.
      • 만약 공간 재확보(Space-Reclamation) 단계가 온다면, young-only 단계는 1회의 Mixed-GC만 진행하고 완료된다.
  • Space Reclamation 단계: G1 GC가 Young 영역에 대해서 GC를 처리하는 것 이외에도 Old 영역에서의 GC를 동작시킴으로써 메모리를 회수하는 단계
profile
평범한 백엔드 개발자

0개의 댓글