Java
[JVM 밑바닥까지 파헤치기] 3-2. 가비지 컬렉터와 메모리 할당 전략: 가비지 컬렉션
noahkim_
2024. 12. 21. 00:25
저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 세대 단위 컬렉션 이론
- 대부분의 GC들의 근간 이론
- 객체들을 나이에 따라 각기 다른 영역에 할당
- 죽을 운명인 객체들을 한데 모음
- 살아남을 객체를 나이가 있는 곳의 영역에 유지
가설
가설 이름 | 설명 | 주요 전략 / 효과 |
약한 세대 가설 | 대부분 객체는 금방 사라진다 | - Young GC를 자주 실행 - 빠른 회수로 공간 확보 |
강한 세대 가설 | 오래 살아남은 객체는 더 오래 생존할 가능성이 높다 | - 일정 생존 횟수 넘기면 Old 영역으로 승격 - Old GC는 드물게 실행 |
세대 간 참조 가설 | 세대 간 참조는 드물고, 대부분은 같은 세대끼리 참조 | - Remembered Set 사용해 세대 간 참조만 추적 - 구세대를 전체 스캔하지 않음 |
GC 종류
GC 종류 | 대상 영역 | 발생 조건 | 주요 특징 및 영향 |
Minor GC | Young Generation | Eden 또는 Survivor 공간 부족 시 |
- 빠름
- 자주 발생 - Stop-the-World 발생 |
Major GC | Old Generation | Old 영역이 꽉 찼을 때 |
- 느림
- 객체가 많아 정리 비용 큼 |
Full GC | 전체(Young + Old + 기타) | 명시적 호출 (System.gc()) 또는 메모리 압박 |
- 가장 느림
- 전체 정지 - 성능에 큰 영향 |
2. 알고리즘
Mark-Copy (Young Generation)
항목 | 세미 스페이스 복사 알고리즘 |
아펠 스타일 복사 알고리즘
|
대상 | Young Generation |
Young Generation + Old Generation
|
구조 | 2개 공간으로 분할 (From / To Space) |
다중 분할 (Eden, Survivor1, Survivor2, Old Generation 등)
|
작동 방식 | 살아남은 객체만 To Space로 복사 |
Survivor 영역 간 복사 + 필요 시 Old Generation으로 이동
|
장점 | 메모리 단편화 방지 |
메모리 낭비 최소화 (효율적 영역 활용)
|
단점 | 전체 공간의 절반만 실제 데이터 저장에 활용됨 |
구조 복잡
관리 오버헤드 |
기타 | 단순 구조 GC 속도 빠름 |
메모리 할당 보증
Old Generation 공간 부족 시 Full GC 발생 |
Old Generation
항목 | Mark-Sweep | Mark-Compact |
작동 방식 | 1. 도달 가능한 객체 표시 (Mark) 2. 표시 안된 객체 제거 (Sweep) |
1. 도달 가능한 객체 표시 (Mark)
2. 한쪽 끝으로 압축 이동 (Compact) |
장점 | 구현 단순 |
연속된 메모리 확보
효율적 공간 재활용 |
단점 | 단편화 발생 실행 시간 예측 어려움 |
참조 주소 업데이트 필요 -> Stop-the-world 발생 |
기타 특징 | 순수 회수 기반 |
객체 생존율 높은 경우에 적합
|