Java

[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터

noahkim_ 2024. 12. 21. 23:36

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

  • JDK 7 ~ JDK 11 내의 GC 기술
  • 고성능 / 저지연 컬렉터들과 구분됨

 

1. 구세대

컬렉터 특징 요약 핵심 설명 관련 매개변수
Serial Old 단일 스레드
Mark-Compact
가장 단순한 GC
메모리 사용량은 적지만 멀티코어 환경에선 매우 느림
테스트 환경 또는 작은 앱에서 사용
-XX:+UseSerialGC
CMS 동시성 지원
Mark-Sweep
Pause time 적음 (GC 스레드와 사용자 스레드 병행)
Full GC 때는 Stop-the-world
메모리 단편화 발생
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction
Parallel Old 멀티스레드
Mark-Compact
Throughput 중점
멀티코어 환경에서 GC도 병렬 수행
→ throughput은 높지만, pause time은 김
-XX:+UseParallelGC

 

2. 신세대

컬렉터 특징 요약 핵심 설명 관련 매개변수
ParNew Serial의 병렬 버전
(CMS와 조합)
CMS와 조합하기 위한 병렬 Mark-Copy 방식
단독으로는 PS보다 느릴 수 있음
-XX:+UseParNewGC
Parallel Scavenge Throughput 중심
적응형 힙 튜닝
Throughput이 가장 중요할 때 쓰는 신세대 GC
멀티스레딩 + 자동 힙 조절 지원으로 배치 처리 등에 유리
응답성은 떨어짐
-XX:+UseParallelGC
-XX:+UseAdaptiveSizePolicy
-XX:MaxGCPauseMillis
-XX:GCTimeRatio

 

3. 전체 세대

G1 GC

항목 설명
세대 구분 방식 - 전체 힙을 Region으로 나눔 (yound과 old 구분 안함)
부분 회수 - 가비지 비율이 높은 리전부터 우선 회수
정지 시간 예측 모델
- 설정한 MaxGCPauseMillis 안에서 작업 수행
- GC의 예측 가능한 정지 시간 보장
단편화 방지
- 리전 단위의 compact 처리
- 거대 객체는 별도 '거대 리전'에서 관리하여 단편화 최소화
리전 간 참조 처리
- RSet(Remembered Set) + Write Barrier로 교차 참조 문제 해결
SATB 방식
- Snapshot-At-The-Beginning
- 동시 마크 단계에서 스냅샷 생성하여 사용자 스레드와 병행 처리
거대 리전
- 리전 크기의 절반 이상인 객체를 별도로 관리
- 일반 GC 로직과 분리되어 효율적
대표 매개변수
- -XX:G1HeapRegionSize → 리전 크기 설정
- -XX:MaxGCPauseMillis → 최대 정지 시간
- -XX:InitiatingHeapOccupancyPercent → GC 시작 시점(힙 사용량 기준)