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 시작 시점(힙 사용량 기준) |