Java

[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터

noahkim_ 2024. 12. 21. 23:36

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

  • JDK 7 ~ JDK 11 내의 GC 기술
  • 고성능 / 저지연 컬렉터들과 구분됨

 

1. 구세대

시리얼 올드 컬렉터

  • 가장 기초적이고 오래된 컬렉터
    • Mark-Compact 알고리즘
    • 단일 스레드
  • 메모리 사용량이 적음
  • 멀티코어 시스템에서 성능이 저하됨

 

매개변수
  • -XX: +UseSerialGC: 시리얼 올드 컬렉터와 신세대 시리얼 컬렉터가 모두 활성화됨

 

CMS 컬렉터

  • 동시성을 지원하는 최초의 컬렉터
    • GC 스레드와 사용자 스레드가 동시에 실행됨
  • 일시 정지 시간을 최소로 줄이는데 집중
  • 구세대가 68% 이상 차면 동작함

 

Mark-Sweep 알고리즘
  • 최초 표시 (Stop-The-World): GC 루트에서 직접 참조되는 객체 표시
  • 동시 표시: GC 루트에서 도달 가능한 모든 객체를 추적하고 마킹
  • 재표시 (Stop-The-World): 사용자 스레드가 참조 관계를 변경한 객체들을 다시 확인 및 갱신
  • 동시 쓸기: 마킹되지 않은 객체를 회수

 

매개변수
  • -XX: UseConcMarkSweepGC: CMS 활성화
  • -XX: CMSInitiatingOccupancyFraction: CMS 가동 조건 (구세대 메모리 점유율)
  • -XX: UseCMSCompactAtFullCollection: GC 수행 후, 조각 모음 수행
  • -XX: CMSFullGCsBeforeCompaction: 해당 횟수 이상 Full GC 수행 시, 조각 모음 수행

 

패러렐 올드 컬렉터 

  • PS 컬렉터의 구세대용 버전
    • 멀티스레드 (병렬 처리)
    • Mark-Compact 알고리즘
  • 처리량에 집중한 GC

 

매개변수
  • -XX: +UseParallelGC: 신세대 PS 컬렉터와 함께 사용

 

2. 신세대

파뉴 컬렉터

  • 시리얼 컬렉터를 병렬화한 버전 (멀티스레딩 환경)
    • 병렬화 이외에 완전히 같음
  • CMS 컬렉터와 조합할 수 있음

 

매개변수
  • -XX: +UseParNewGC: 파뉴 활성화

 

패러렐 스캐빈지 컬렉터 (PS 컬렉터)

  • 멀티 스레드 환경 (병렬 처리)
  • 처리량 제어에 집중
    • 가비지 컬렉터 소비 시간을 줄이기
  • Mark-Copy 알고리즘
  • 자원을 효율적으로 사용
  • 상호 작용할 일이 많지 않은 프로그램에 알맞음

 

매개 변수
  • -XX: MaxGCPauseMillis: GC 정지 시간의 최댓값 (작을수록 신세대 메모리 량과 처리량이 줄어듬)
  • -XX: GCTimeRatio: GC 처리량
  • -XX: +UseAdaptiveSizePolicy: 힙의 메모리 크기를 최적의 사이즈로 조율함

 

3. 전체 세대

G1 컬렉터

  • JDK 8

 

전체 세대를 리전별로
  • 특정 영역만 회수 가능
  • 메모리 단편화 방지

 

리전간 참조 문제
  • RSet과 Write Barrier로 해결

 

거대 리전
  • 특정 크기 이상의 객체를 관리하는 영역
    • 리전 크기의 절반 이상
  • 일반적인 GC 작업과 독립적으로 관리됨
  • 단편화 문제를 줄임

 

정지 시간 예측 모델
  • 설정된 시간까지만 정지 시간을 통제

 

부분 회수
  • 각 리전의 가비지 비율을 계산하여, 가비지가 많은 영역부터 회수 수행
  • 신세대와 구세대를 함께 처리
  • 신뢰성 확보 목적
  • 자원을 효율적으로 사용

 

SATB (Snapshot-at-the-Beginning)
  • 사용자 스레드가 일시정지하지 않고 동시 표시하는 방법
  • 동시 표시 수행 시, 현재 객체 그래프의 스냅샷을 생성
    • 사용자 스레드가 객체를 변경하면 스냅샷에 갱신
    • GC 스레드는 스냅샷으로 살아있는 객체를 추적

 

매개 변수
  • -XX: G1HeapRegionSize: 리전 크기
  • -XX: MaxGCPauseMillis: GC의 최대 정지 시간
  • -XX: InitiatingHeapOccupancyPercent: 힙의 사용량이 해당 값 초과 시 GC 작업 수행