ZGC

대부분의 GC 작업을 애플리케이션과 동시에 실행하여 힙 크기에 관계없이 STW를 1ms 이하로 유지하는 초저지연 GC입니다.

기존 GC와의 차이

[G1 GC]
애플리케이션: [====]  [====]  [====]
GC:               [STW][concurrent][STW]
→ STW가 여러 번 발생

[ZGC]
애플리케이션: [========================]
GC:          [concurrent==============][STW(1ms)]
→ 거의 모든 작업을 동시에 처리
→ STW는 아주 짧게만 발생

핵심 기술

1. Colored Pointers (색깔 있는 포인터)

일반 포인터: [       메모리 주소       ]

ZGC 포인터: [GC 상태 bits][메모리 주소]
             ↑
       4가지 상태 정보 저장
       - Marked0
       - Marked1
       - Remapped
       - Finalizable

→ 포인터 자체에 GC 상태를 저장
→ 별도 자료구조 없이 객체 상태 파악 가능

2. Load Barriers (로드 배리어)

객체 참조 시 자동으로 GC 상태 확인

Object obj = ref;  // 일반 코드
           ↓
// ZGC가 내부적으로 처리
Object obj = ref;
if (ref의 포인터 상태 확인 필요) {
    // 필요한 GC 작업 수행 (재배치 등)
}

→ 애플리케이션 실행 중에도 GC 작업 가능
→ STW 없이 객체 이동 가능

동작 단계

1. Initial Mark (STW - 1ms 이하)
   GC Root 마킹

2. Concurrent Mark (동시)
   애플리케이션과 동시에 전체 힙 마킹

3. Remark (STW - 1ms 이하)
   마킹 마무리

4. Concurrent Prepare for Relocation (동시)
   이동시킬 Region 선별

5. Initial Relocation (STW - 1ms 이하)
   GC Root가 참조하는 객체 이동

6. Concurrent Relocation (동시)
   나머지 객체 이동 (애플리케이션과 동시)
   Load Barrier가 이동된 참조 자동 수정

STW 비교

힙 크기 100GB 가정

Parallel GC: STW 수십 초
G1 GC:       STW 수백 ms
ZGC:         STW 1ms 이하 O (힙 크기 무관)

장단점

장점단점
STW 1ms 이하Load Barrier로 인한 CPU 오버헤드
힙 크기 무관한 일정한 STW처리량(Throughput)이 G1보다 낮음
8MB ~ 16TB 힙 지원Java 15+ (비교적 최신)
대규모 힙에서도 안정적튜닝 옵션 적음

GC 선택 기준

처리량(Throughput) 중요    → Parallel GC
응답시간 + 대용량 힙       → G1 GC
초저지연 (1ms 이하)        → ZGC

Java 버전별 ZGC

버전내용
Java 11실험적 도입
Java 15정식 출시
Java 16동시 스레드 스택 처리 추가
Java 21세대별 ZGC 도입 (Young/Old 분리)
// ZGC 활성화
-XX:+UseZGC

// Java 21 세대별 ZGC
-XX:+UseZGC -XX:+ZGenerational

ZGC는 힙 크기가 커져도 STW가 늘어나지 않는 것이 핵심 장점으로, 수십 GB 이상의 대용량 힙을 사용하면서 응답시간이 중요한 서비스에 적합합니다.

CSLOG에서 보기