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 시간 김