TIL

Chapter 7. 가비지 수집 고급

7.1 트레이드오프와 탈찰형 수집기

7.2 동시 GC 이론

7.2.1 JVM 세이프포인트

7.2.2 삼색 마킹

7.3 CMS

CMS 수행 단계

  1. 초기 마킹 (Initial Mark), STW
    1. ‘초기 마킹’ 단계의 목적은 해당 영역 내부의 확실한 GC 출발점(내부 포인터, 목적상 GC 루트와 같음)을 얻는 것이다.
  2. 동시 마킹 (Concurrent Mark)
    1. 삼색 마킹 알고리즘을 힙에 적용
    2. 나중에 조정해야 할지 모를 변경사항을 추적한다.
  3. 동시 사전 정리 (Concurrent Preclean)
    1. 재마킹 단계에서 가능한 STW 시간을 줄이는 것이 목표
  4. 재마킹 (Remark), STW
    1. 카드 테이블을 이용해 변경자 스레드가 동시 마킹 단계 도중 영향을 끼친 마킹을 조정한다.
  5. 동시 스위프 (Concurrent Sweep)
  6. 동시 리셋 (Concurrent Reset)

CMS를 워크로드에 적용했을 때의 효험

  1. 애플리케이션 스레드가 오래 멈추지 않는다.
  2. 단일 풀 GC 사이클 시간이 더 길다.
  3. CMS GC 사이클이 실행되는 동안 애플리케이션 처리율은 감소한다.
  4. GC가 객체를 추적해야 하므로 메모리를 더 많이 쓴다.
  5. GC 수행에 훨씬 더 많은 CPU 시간이 필요하다.
  6. CMS는 힙을 압착하지 않으므로 테뉴어드 영역은 단편화될 수 있다.

7.3.1 CMS 작동 원리

7.3.2 CMS 기본 JVM 플래그

7.4 G1

오라클은 자바 9부터 G1을 디폴트 수집기로 정해 병렬 수집기를 대체하겠다고 밝혔다.

7.4.1 G1 힙 레이아웃 및 영역

7.4.2 G1 알고리즘 설계

리전을 절반 이상 점유한 객체는 거대 객체(humongous object)로 간주하여 ‘Humongous region(거대 리전)’이라는 별도 공간에 바로 할당한다. 거대 리전은 테뉴어드 세대에 속한 연속된 빈 공간이다.

7.4.3 G1 단계

7.4.4 G1 기본 JVM 플래그

7.8 레거시 핫스팟 수집기

7.8.1 Serial 및 Serial Old

7.8.2 증분 CMS(iCMS)

7.8.3 디프리케이티드되어 사라진 GC 조합

조합 플래그
DefNew + CMS -XX: -UseParNewGc -XX:+UseConcMarkSweepGC
ParNew + SerialOld -XX:+UseParNewGC
ParNew + iCMS -Xincgc
ParNew + iCMS -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC
ParNew + iCMS -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC -XX:-UseParNewGC
CMS foreground -XX:+UseCMSCompactAtFullCollection
CMS foreground -XX:+CMSFullGCBeforeCompaction
CMS foreground -XX:+UseCMSCollectionPassing

7.8.4 엡실론