Spring
Deep Dive
JVM GC

G1GC (Garbage First GC)

특징

  • 출시: Java 7에서 실험적으로 도입, Java 9부터 기본 GC
  • 목표: 큰 힙 메모리(4GB~64GB)에서 낮은 지연 시간 제공
  • 힙 구조: 힙을 동일한 크기의 여러 영역(Region)으로 분할

핵심 동작 원리

장점

  1. 예측 가능한 GC 시간: -XX:MaxGCPauseMillis 옵션으로 목표 중단 시간 설정 가능
  2. 점진적 컬렉션: 전체 힙을 한 번에 수집하지 않고 우선순위 기반으로 Region 선택
  3. 병렬 처리: 여러 스레드가 동시에 GC 작업 수행
  4. 메모리 압축: 단편화 해결을 위한 압축 작업

단점

  1. 메모리 오버헤드: Region 관리를 위한 추가 메타데이터 필요
  2. CPU 오버헤드: 복잡한 알고리즘으로 인한 CPU 사용량 증가
  3. 작은 힙에서는 비효율적: 4GB 미만에서는 다른 GC가 더 효율적

ZGC (Z Garbage Collector)

특징

  • 출시: Java 11에서 실험적으로 도입, Java 15부터 프로덕션 준비
  • 목표: 매우 낮은 지연 시간 (10ms 미만의 GC 중단 시간)
  • 힙 크기: 8MB부터 16TB까지 지원

핵심 동작 원리

Colored Pointers + Load Barriers

  • 64비트 포인터의 상위 비트를 GC 상태 정보로 활용
  • Load Barrier를 통해 객체 접근 시 실시간으로 재배치 처리

장점

  1. 초저지연: 힙 크기와 관계없이 10ms 미만의 중단 시간
  2. 확장성: 매우 큰 힙 메모리에서도 일정한 성능
  3. 동시 처리: 애플리케이션 실행과 동시에 GC 작업 수행
  4. 메모리 효율성: 압축과 재배치를 동시에 수행

단점

  1. 메모리 오버헤드: Colored Pointers로 인한 메모리 사용량 증가
  2. CPU 오버헤드: Load Barrier로 인한 성능 오버헤드
  3. 플랫폼 제한: 64비트 플랫폼에서만 지원 (이유는 네이버 블로그에 나와있음 (opens in a new tab))

G1GC vs ZGC 비교

  • 🔄 G1 GC: 고정된 Region 기반의 객체 이동
    • G1 GC는 힙을 고정 크기의 Region으로 나누어 관리합니다.
    • Compaction 과정에서 살아있는 객체를 다른 Region으로 복사하여 메모리 단편화를 줄입니다.
    • 이 과정에서 객체 간 참조 관계를 유지하기 위해 동기화 작업이 필요하며, 이로 인해 추가적인 비용이 발생할 수 있습니다
  • 🧠 ZGC: 동적 크기의 ZPage 기반의 객체 이동
    • ZGC는 ZPage라는 동적 크기의 메모리 블록을 사용하여 메모리를 관리합니다.
    • Compaction 시 새로운 ZPage를 생성하고, 살아있는 객체를 해당 ZPage로 이동시킵니다.
    • 이 방식은 기존 객체와 새로운 객체 간의 동기화 문제를 최소화하며, 메모리 단편화도 효과적으로 줄일 수 있습니다.
  • ✅ 결론
    • 따라서, G1 GC는 고정된 Region을 사용하여 객체를 이동시키는 반면, ZGC는 동적 크기의 ZPage를 활용하여 객체를 이동시킵니다. 이로 인해 ZGC는 객체 간 동기화 문제를 효과적으로 해결하며, 메모리 단편화도 줄일 수 있습니다. 드림어스 컴퍼니 블로그 (opens in a new tab)

실무 적용 가이드

G1GC 설정 예시

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:+G1UseAdaptiveIHOP

ZGC 설정 예시

-XX:+UseZGC
-XX:+UnlockExperimentalVMOptions  # Java 11~14
-Xmx32g

선택 기준

  1. G1GC를 선택하는 경우:

    • 4GB 이상의 힙 메모리 사용
    • 예측 가능한 GC 중단 시간이 필요
    • 안정성과 성숙도가 중요한 프로덕션 환경
  2. ZGC를 선택하는 경우:

    • 매우 낮은 지연 시간이 절대적으로 중요
    • 대용량 힙 메모리 사용 (수십 GB 이상)
    • Java 15 이상 사용 가능한 환경

결론

G1GC는 대부분의 서버 애플리케이션에 적합한 균형잡힌 선택이며, ZGC는 초저지연이 필수적인 특수한 요구사항에 최적화된 GC입니다. 실제 선택은 애플리케이션의 특성, 성능 요구사항, 인프라 환경을 종합적으로 고려하여 결정해야 합니다.