Oracle의 공식문서 HotSpot Virtual Machine Garbage Collection Tuning Guide을 참고했습니다.
🔎 Garbage-First Internals
✅ Java Heap Sizing
-XX:InitialHeapSize
, -XX:MaxHeapSize
: 초기/최대 힙 사이즈
-XX:MinHeapFreeRatio
, -XX:MaxHeapFreeRatio
: GC 후 남겨야 할 최소/최대 여유 공간 비율
- 힙 확장은 GC 중 (pause 중), 메모리 반환은 GC 후 (concurrent하게) 발생
Young-Only Phase Generation Sizing
- G1은 pause time 목표(-XX:MaxGCPauseMillis)를 충족하기 위해 Young 영역 크기를 동적으로 조절함
- Young GC를 마친 후 다음 mutator phase를 대비해 Young 크기를 결정함
-XX:G1NewSizePercent
, -XX:G1MaxNewSizePercent
: Young 영역 크기 조정 범위
-XX:NewSize
, -XX:MaxNewSize
: Young 영역 고정 (지정 시 pause time 목표 비활성화)
Space-Reclamation Phase (Mixed GC)
- Old 영역을 점진적으로 청소하는 단계
- Mixed GC 시 Old 영역 중 일부 Region을 선택하여 Collection Set에 포함
-XX:G1MixedGCCountTarget
: Space Reclamation Phase의 목표 GC 횟수
-XX:G1MixedGCLiveThresholdPercent
: 살아있는 객체가 너무 많으면 해당 Region은 GC 대상에서 제외
주기적 GC (Periodic GC)
- 오랫동안 GC가 발생하지 않으면, G1이 주기적으로 강제로 GC를 유도
- -XX:G1PeriodicGCInterval: 주기적 GC를 유도할 최소 간격(ms)
- 시스템 부하가 너무 높을 경우 GC를 건너뛰도록
-XX:G1PeriodicGCSystemLoadThreshold
설정 가능
Determining Initiating Heap Occupancy
IHOP (Initiating Heap Occupancy Percent)
- Concurrent Marking을 언제 시작할지 결정하는 기준값
- Adaptive IHOP: 관측 데이터를 기반으로 동적으로 임계치 결정
-XX:InitiatingHeapOccupancyPercent
: 초기값 / Adaptive 껐을 때 고정값
Marking (SATB 알고리즘)
• Snapshot-At-The-Beginning (SATB) 사용 → 마킹 시작 시점에 살아있던 객체는 계속 살아있는 것으로 간주
• 정확도보다 pause time 최소화에 중점
• 이후 다시 marking 하면서 진짜 죽은 객체들은 나중에 제거됨
Behavior in Very Tight Heap Situations
• 복사할 공간이 부족하면 Evacuation Failure
• 일부 객체는 새 위치에 복사 못하고 기존 위치 유지 + 참조만 수정
• 상태가 심각하면 결국 Full GC 강제 수행
Humongous Objects
• Region의 절반 이상 크기의 객체는 여러 Region을 연속해서 차지
• 메모리 파편화 이슈 유발 가능
• G1은 -XX:G1EagerReclaimHumongousObjects로 이러한 객체를 더 자주 회수 시도
🔎 Ergonomic Defaults for G1 GC

🔎 Comparison to Other Collectors
✅ G1 vs 다른 GC
- Parallel GC: Old Generation은 전체를 한 번에 수집
- G1: Old Generation을 여러 번에 걸쳐 나눠서 수집 → pause time 짧음
- ZGC: pause time 최소화에 집중, G1보다 낮은 지연, 하지만 Throughput 희생 가능성
- G1은 일부 Region을 즉시 회수하여 전체 GC 횟수 감소 효과