[JAVA] 공식문서로 공부하는 Garbage Collection - Ch 7. Garbage-First (G1) Garbage Collector(2)

예름·2025년 4월 17일
3

Java

목록 보기
9/9
post-thumbnail

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 횟수 감소 효과
profile
안정적인 쳇바퀴를 돌리는 삶

0개의 댓글