저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 세대 단위 컬렉션 이론
- 대부분의 GC들의 근간 이론
- 객체들을 나이에 따라 각기 다른 영역에 할당
- 죽을 운명인 객체들을 한데 모음
- 살아남을 객체를 나이가 있는 곳의 영역에 유지
가설
약한 세대 가설
- 대다수 객체는 일찍 죽음
- 메모리 접근 최적화
- Young Generation을 대상으로 GC를 자주 실행시킴
강한 세대 가설
- 살아남은 횟수가 늘어날수록, 더 오래 살 가능성이 높음
- 메모리 접근 최적화
- 장기 생존하는 객체는 Old Generation로 이동
- Old Generation를 대상으로 GC를 자주 실행하지 않음
세대 간 참조 가설
- 세대 간 참조의 개수는 같은 세대 안에서의 참조보다 훨씬 적음
- 상호 참조 관계
- 두 객체는 삶과 죽음을 함께하는 경향이 있음
- 결국 같은 세대가 되므로 세대 간 참조는 자연스럽게 사라지게 됨
- 신세대에 기억 집합을 두어 어디에 세대 간 참조가 있는지 기록
- 세대 간 참조 수는 매우 적으므로 구세대 전체를 스캔하는 건 낭비
- 두 객체는 삶과 죽음을 함께하는 경향이 있음
GC 종류
Minor GC
- Young Generation 영역 회수
Major GC
- Old Generation 영역 회수
Full GC
- 전체 영역 회수
2. Mark-Sweep 알고리즘
과정
Mark
- 회수할 객체들을 모두 표시
Sweep
- 표시된 객체를 모두 회수
단점
실행 효율이 일정하지 않음
- 회수할 객체가 많다면 Mark, Sweep 과정이 많아짐
메모리 파편화가 심함
- Sweep 이후, 메모리는 불연속적으로 파편화 됨
3. Mark-Copy 알고리즘
- Mark-Sweep을 보완한 알고리즘
세미 스페이스 복사 알고리즘
- Young Generation 대상
- 메모리를 두 개의 영역으로 나눔
- From Space: 객체들을 한쪽에 생성
- To Space: 살아남은 객체만 From Space에서 순서대로 복사
장점
- 메모리 단편화 방지
단점
- 메모리 낭비: 메모리를 반밖에 사용할 수 없음
아펠 스타일 복사 알고리즘
- 세미 스페이스 복사 알고리즘의 메모리 낭비를 보완하기 위한 방식
메모리를 여러개의 영역으로 나눔
- Young Generation (9): Eden (8) - Survivor1 (1) - Survivor2 (1)
- Old Generation (1)
메모리 할당 보증
- Young Generation의 메모리가 부족하면 Old Generation이 이를 보증
- Old Generation의 메모리가 부족하면 Full GC가 수행됨
3. Mark-Compact 알고리즘
- Mark-Copy는 생존율이 높을수록 복사할게 많아 효율이 좋지 않음
- 객체를 압축함 (메모리 이동)
- 생존한 모든 객체를 메모리 영역의 한쪽 끝으로 이동시킴
- 일시 정지 현상이 발생 (stop the world)
장점
- 연속된 사용 가능한 메모리 공간 확보
- 남은 공간을 한꺼번에 비움
단점
- 회수 작업이 복잡
- 객체 이동으로 인한 참조 업데이트 필요
'Java' 카테고리의 다른 글
[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터 (0) | 2024.12.21 |
---|---|
[JVM 밑바닥까지 파헤치기] 3-3. 가비지 컬렉터와 메모리 할당 전략: 구현 (1) | 2024.12.21 |
[JVM 밑바닥까지 파헤치기] 3-1. 가비지 컬렉터와 메모리 할당 전략: 회수 (1) | 2024.12.19 |
[JVM 밑바닥까지 파헤치기] 2. 자바 메모리 영역과 메모리 오버플로 (1) | 2024.12.19 |
[JVM 밑바닥까지 파헤치기] 1. 자바 기술 시스템 소개 (3) | 2024.12.19 |