G1 GC

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

기존 GC와의 차이

[기존 GC - 고정된 영역]
┌──────────┬────┬────┬──────────────────┐
│   Eden   │ S0 │ S1 │   Old Generation │
└──────────┴────┴────┴──────────────────┘
→ 영역 크기 고정, 역할 고정

[G1 GC - Region 기반]
┌───┬───┬───┬───┐
│ E │ S │ O │ E │
├───┼───┼───┼───┤
│ O │ E │ H │ S │
├───┼───┼───┼───┤
│ E │ O │ E │ O │
└───┴───┴───┴───┘
→ 각 Region이 동적으로 역할 변경
→ H: Humongous (거대 객체 전용 Region)

Region 종류

Region설명
Eden새로 생성된 객체 저장
SurvivorMinor GC 생존 객체
Old오래 살아남은 객체
HumongousRegion 크기 50% 이상인 거대 객체
Free아직 역할 미지정

동작 단계

1. Young GC

Eden Region이 꽉 참 → STW 발생
→ Eden + Survivor Region에서 살아남은 객체
→ 새로운 Survivor Region으로 이동
→ age 초과 객체는 Old Region으로 Promotion
→ 기존 Eden Region → Free Region으로 전환

2. Concurrent Mark (동시 마킹)

Old Region 사용량이 임계값(기본 45%) 초과 시 시작
→ 애플리케이션과 동시에 실행 (STW 없음)

1. Initial Mark    → GC Root 마킹 (STW, 짧음)
2. Root Region Scan → Survivor Region 스캔 (동시)
3. Concurrent Mark → 전체 힙 살아있는 객체 마킹 (동시)
4. Remark          → 마킹 마무리 (STW, 짧음)
5. Cleanup         → 빈 Region 회수 (STW, 짧음)

3. Mixed GC

Concurrent Mark 완료 후
→ Young Region + 가비지 비율 높은 Old Region 선별 수거

가비지 비율 높은 순서대로 수거 (Garbage First!)
→ 제한된 STW 시간 내에 최대한 많은 가비지 수거

4. Full GC (최후 수단)

Mixed GC로도 메모리 부족 시 발생
→ 단일 스레드 Mark-Sweep-Compact (매우 느림)
→ 가능하면 발생하지 않도록 튜닝 필요

핵심 - Garbage First

각 Region의 가비지 비율을 추적
→ 가비지 많은 Region부터 우선 수거
→ 제한된 STW 시간 내 최대 효율 달성

Region A: 가비지 90% → 먼저 수거 O
Region B: 가비지 20% → 나중에 수거

STW 목표 시간 설정

-XX:MaxGCPauseMillis=200  // 기본값 200ms

G1 GC는 이 목표 시간 안에 수거할 Region 수를 조절
→ 목표 시간이 짧을수록 한 번에 수거하는 양 감소
→ 목표 시간이 길수록 한 번에 수거하는 양 증가

전체 흐름

객체 생성 → Eden Region
     ↓ (Eden 꽉 참)
  Young GC → Survivor / Old Region으로 이동
     ↓ (Old 사용량 45% 초과)
  Concurrent Mark → 살아있는 객체 파악
     ↓
  Mixed GC → Young + Old Region 수거
     ↓ (메모리 부족)
  Full GC → 전체 수거 (최후 수단)

기존 GC와 비교

Parallel GCG1 GC
힙 구조고정 영역동적 Region
STW 예측어려움가능 (목표 시간 설정)
힙 크기중규모대규모 (4GB+)
단편화발생 가능Region 단위 관리로 감소
Full GC자주 발생최후 수단

G1 GC는 STW 시간을 예측 가능하게 제어할 수 있어, 응답시간이 중요한 대규모 서버 환경에 적합하며 Java 9부터 기본 GC로 채택되었습니다.

CSLOG에서 보기