[F-Lab 모각코 챌린지] 31일차 - ZGC(1)

F-Lab 모각코 챌린지 31일차 정리 내용입니다 ZGC 에 대해 정리 하였습니다. 하지만 내용이 너무 많아서 여러 부로 나누었습니다.

[F-Lab 모각코 챌린지] 31일차 - ZGC(1)

Z GC

Z Garbage Collector

  • ZGC 는 대규모 힙과 낮은 지연시간을 목표로 설계되었다
  • Java 11 에서 실험적으로 추가되었으며 Java 15 에서 안정되었다
  • Java 15 에서도 기본 GC 는 G1GC 인데, ZGC 는 옵션을 통해 사용할 수 있다
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

기본 설명

Mark & Sweep

GC 는 기본적으로 Mark & Sweep 알고리즘을 사용한다

  • Mark: 사용중인 객체를 마킹
  • Sweep: 마킹되지 않은 객체들의 메모리를 회수

ZGC 역시 이와 같은 알고리즘을 사용하여 GC 를 수행한다

ZPage

ZGC 는 메모리 영역(Region) 을 동적으로 생성/삭제 하며 부여한다. 이러한 메모리 영역을 ZGC 에서는 ZPage 로 정의한다.

이러한 ZPage 는 2MB 배수 형태로 관리하며 아래의 타입으로 분류한다

Getting started with Z Garbage Collector (ZGC) in Java 11 [Tutorial] | Packt Hub (packtpub.com)
  • Small (2MB)
  • Medium (32MB)
  • Large (N*2MB)

ZGC 단계

ZGC 는 총 9단계로 이루어져있다. C++ JNI 코드 주석 보기

  1. Pause Mark Start
    ZGC 의 GC 사이클을 시작한다
    이 단계에서는 ZGC 가 객체 그래프 탐색을 시작하기 위한 루트 집합을 식별한다
    루트(Root) 집합을 찾는 과정은 애플리케이션 스레드를 잠시 중단하는 상태에서 진행된다.
  2. Concurrent Mark
    루트 집합에서 시작하여 힙에 있는 모든 객체를 탐색하며, 도달 가능한 객체를 마킹한다
    이 과정은 애플리케이션 스레드와 동시에 병렬로 수행된다
  3. Pause Mark End
    마킹 프로세스를 완료하는 데 필요한 최종 작업을 수행한다
    애플리케이션 스레드는 잠시 중단된다
  4. Concurrent Process Non-Strong References
    약한 참조(Weak references), 소프트 참조(Soft references), 팬텀 참조(Phantom references), finalizable 객체와 같은 '강하지 않은(Non-Strong)' 참조를 감지하고 필요한 경우 메모리 회수를 진행한다
  5. Concurrent Reset Relocation Set
    ZGC 가 이동할 객체들을 담을 relocation set 을 초기화 한다
    이는 다음 단계에서 이동 할 객체들을 선택하는 데 사용된다
  6. Pause Verify
    ZGC 가 힙의 일관성을 확인한다
  7. Concurrent Select Relocation Set
    이동 할 객체들을 선택한다
    힙 메모리의 단편화를 줄이고 메모리를 효율적으로 사용하기 위함
  8. Pause Relocate Start
    이동 할 객체들의 집합을 최종적으로 선정하며 이동이 필요한 메모리 영역을 준비한다
    이 과정에서 애플리케이션 스레드는 잠시 중단된다
  9. Concurrent Relocate
    선택된 객체들을 새로운 위치로 이동시키는 실제 재배치 작업을 수행한다
    이 작업은 애플리케이션과 동시에 수행되며 메모리가 회수되고 힙의 단편화가 줄어든다
    9.1. 객체 이동: 선택된 relocation set 내부의 객체들은 새로운 위치로 이동된다
    9.2. 참조 업데이트: 이동된 객체들을 가리키는 모든 참조가 새로운 위치로 업데이트 된다
    9.3. 메모리 회수: 객체가 이동한 후, 이전 영역을 더 이상 사용되지 않으므로 메모리가 회수된다