GC 종류

Serial GC

단일 스레드로 GC를 수행하는 가장 단순한 GC입니다.

GC 발생 → 단일 스레드가 모든 GC 작업 처리
→ STW 시간이 가장 길다

Young: Copy 알고리즘ㄱ
Old:   Mark-Sweep-Compact 알고리즘
항목내용
스레드단일
STW가장 김
적합한 환경단일 코어, 소규모 메모리
JVM 옵션-XX:+UseSerialGC

Parallel GC

여러 스레드로 GC를 병렬 수행하여 STW 시간을 줄인 GC입니다.

GC 발생 → 여러 스레드가 동시에 GC 작업 처리
→ Serial GC보다 STW 시간 단축

Young: Parallel Copy 알고리즘
Old:   Parallel Mark-Sweep-Compact 알고리즘
항목내용
스레드멀티 (기본: CPU 코어 수)
STWSerial보다 짧음
적합한 환경멀티코어, 처리량 중요한 서버
Java 버전Java 8 기본값
JVM 옵션-XX:+UseParallelGC

Parallel Old GC

Parallel GC를 Old 영역까지 확장하여, Old 영역 수거도 멀티 스레드로 처리하는 GC입니다.

GC 발생 → Young/Old 영역 모두 멀티 스레드로 처리
→ Parallel GC보다 Old 영역 수거 성능 향상
항목내용
스레드멀티 (Young + Old 모두)
적합한 환경Parallel GC와 동일, 처리량 중요
JVM 옵션-XX:+UseParallelOldGC

CMS(Concurrent Mark-Sweep) GC

애플리케이션 스레드와 병렬로 실행되어 STW 시간을 최소화하도록 설계된 GC입니다.

GC 발생 → 애플리케이션과 동시(Concurrent)에 마킹·스윕 수행
→ STW 최소화에 초점

단점: Compaction(압축)을 수행하지 않아 메모리 단편화 발생
      → 메모리, CPU 사용량이 높음
항목내용
스레드멀티 + 동시(Concurrent)
STW짧음 (마킹 시작/종료 시에만 발생)
단점메모리 단편화, 높은 CPU 사용량
Java 버전Java 5~8, Java 9 deprecated, Java 14 제거
JVM 옵션-XX:+UseConcMarkSweepGC

G1 GC (Garbage First GC)

힙을 동일한 크기의 Region으로 분할하여 가비지가 많은 Region부터 우선 수거하는 GC입니다.

힙을 Region으로 분할
┌───┬───┬───┬───┐
│ E │ S │ O │ E │
├───┼───┼───┼───┤
│ O │ E │ S │ O │
└───┴───┴───┴───┘
→ 가비지 비율 높은 Region부터 수거 (Garbage First)
→ STW 목표 시간 설정 가능
항목내용
스레드멀티
STW짧고 예측 가능
힙 구조Region 기반 (동적 역할 변경)
적합한 환경대용량 힙(4GB+), 응답시간 중요
Java 버전Java 9+ 기본값
JVM 옵션-XX:+UseG1GC
// STW 목표 시간 설정 (기본 200ms)
-XX:MaxGCPauseMillis=200

G1 GC 동작 단계

1. Young GC    → Eden, Survivor Region 수거
2. Concurrent Mark → Old Region 동시 마킹 (STW 없음)
3. Mixed GC    → Young + 일부 Old Region 수거
4. Full GC     → 최후 수단 (가능하면 회피)

ZGC (Z Garbage Collector)

대부분의 GC 작업을 애플리케이션 실행과 동시에 처리하여 STW를 극도로 최소화한 GC입니다.

GC 작업 대부분을 애플리케이션 스레드와 동시 수행
→ STW 시간 1ms 이하 목표
→ 힙 크기에 관계없이 일정한 STW 유지
항목내용
스레드멀티 + 동시(Concurrent)
STW1ms 이하
힙 크기8MB ~ 16TB
적합한 환경초저지연 서비스, 대용량 힙
Java 버전Java 15+ (정식)
JVM 옵션-XX:+UseZGC

ZGC 핵심 기술

Colored Pointers: 객체 포인터에 GC 상태 정보 저장
Load Barriers:    객체 접근 시 GC 상태 확인
→ 애플리케이션 실행 중에도 GC 작업 가능

Shenandoah GC

Red Hat에서 개발한 GC로, G1 GC처럼 힙을 Region으로 분할하면서 ZGC처럼 저지연 STW와 대용량 힙 처리를 목표로 합니다.

항목내용
힙 구조Region 기반
STW매우 짧음 (힙 크기와 무관)
Java 버전Java 12+
JVM 옵션-XX:+UseShenandoahGC

Epsilon GC

GC 기능이 없는 실험용(No-Op) GC입니다.

객체 할당만 수행하고 회수는 하지 않음
→ 힙이 가득 차면 OutOfMemoryError 발생

용도: GC 오버헤드를 제외한 순수 성능 측정, 메모리 사용량 한계 테스트
항목내용
GC 수행없음
적합한 환경성능 테스트, 극히 짧은 수명의 작업
Java 버전Java 11+
JVM 옵션-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

전체 비교

SerialParallelCMSG1ZGCShenandoah
스레드단일멀티멀티+동시멀티멀티+동시멀티+동시
STW매우 김중간짧음짧음1ms 이하매우 짧음
처리량낮음높음중간높음중간중간
힙 크기소규모중규모중규모대규모초대규모대규모
Java 기본-Java 8-Java 9+--
처리량 중요    → Parallel GC
응답시간 중요  → G1 GC
초저지연 필요  → ZGC / Shenandoah GC

대부분의 서버 환경에서는 G1 GC가 적합하며, 수십 ms의 지연도 허용되지 않는 실시간 서비스에서는 ZGC나 Shenandoah GC 도입을 고려합니다. CMS GC는 Java 14에서 제거되어 신규 도입 대상이 아닙니다.

→ GC 알고리즘은 어떤 것이 있나요?

CSLOG에서 보기