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 발생
기타 특징 순수 회수 기반
객체 생존율 높은 경우에 적합