Java/JVM
[JVM 밑바닥까지 파헤치기] 3-2. 가비지 컬렉터와 메모리 할당 전략: 가비지 컬렉션
noahkim_
2024. 12. 21. 00:25
저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다.
1. 세대 단위 컬렉션 이론
- 객체들을 나이에 따라 각기 다른 영역에 할당
- ✅ 죽을 운명인 객체들을 한데 모음
- ✅ 살아남을 객체를 나이가 있는 곳의 영역에 유지
가설
| 가설 이름 | 설명 | 주요 전략 / 효과 |
| 약한 세대 가설 | 대부분 객체는 금방 사라진다 | - Young GC를 자주 실행 - 빠른 회수로 공간 확보 |
| 강한 세대 가설 | 오래 살아남은 객체는 더 오래 생존할 가능성이 높다 | - 일정 생존 횟수 넘기면 Old 영역으로 승격 - Old GC는 드물게 실행 |
| 세대 간 참조 가설 | 대부분은 같은 세대끼리 참조함 (세대 간 참조는 드뭄) | - 세대 간 참조만 추적 (Remembered Set 사용) - 구세대를 전체 스캔하지 않음 |
2. GC
Stop-the-World
- GC를 수행하는 동안, 애플리케이션의 모든 스레드를 잠깐 멈추는 것
- GC 작업을 수행함 (Mark, Copy, Sweep , Compact 등을 수행함)
- ✅ 스레드가 멈춰야 안전한 상태에서 메모리 정렬을 할 수 있으므로 모든 스레드가 일시 정지됨
종류
| GC 종류 | 대상 영역 | 발생 조건 | 주요 특징 및 영향 |
| Minor GC (Young GC) |
Young Generation | Eden 또는 Survivor 영역이 꽉 찼을 떄 | - 매우 빠름 - 자주 발생 |
| Major GC (Old GC) |
Old Generation | Old 영역이 꽉 찼을 때 |
- 느림
- 비용 큼 (객체가 많음) |
| Full GC | 전체 (Young + Old + Metaspace) | 명시적 호출 (System.gc()) 또는 메모리 압박 | - 가장 느림 (서비스에 큰 지연) |
3. GC 알고리즘
Mark-Copy (Young Generation)
- Young Generation에서 여러 구역으로 나누고, 도달 가능한 객체만 다른 공간으로 복사하고 기존 공간은 비워버리는 방식
- ✅ 메모리 단편화 없음
| 항목 | 세미 스페이스 복사 | 아펠 스타일 (HotSpot 표준) |
| 대상 | Young | Young (Old와 연계) |
| 구조 | From / To | Eden + Survivor1 + Survivor2 |
| 동작 | 살아남은 객체를 To로 복사 | Eden → Survivor → Old 승격 |
| 승격 | ❌ | 일정 생존 횟수 초과 시 Old |
| 장점 | 구조 단순 | 메모리 낭비 감소 세대 전략 적용 |
| 단점 | 메모리 절반 사용 | 구조 복잡 |
Mark-Sweep & Mark-Compact (Old Generation)
- 도달 가능한 객체를 표시하고, 나머지는 다 제거
| 항목 | Mark-Sweep | Mark-Compact |
| 작동 방식 | Mark → Sweep (삭제) | Mark → Compact (압축 이동) |
| 단편화 | ✅ | ❌ |
| 장점 | 구현 단순 | 연속 메모리 확보 |
| 단점 | 단편화 문제 | 객체 이동 비용 큼, STW 시간 김 |