G1GC(Garbage-First Garbage Collector) 시각화 분석

2D 시뮬레이션으로 보는 JVM 힙 메모리 관리

현재 단계: 대기 중 - 아래 버튼을 눌러 시작하세요

리전 타입 범례

에덴 (Eden)
서바이버 (Survivor)
올드 (Old)
휴먼저스 (Humongous)
컬렉션 셋 (CSET)
이동 대상 (To Space)
비우는 중 (Evacuating)
비어있음 (Empty)

리전 위에 마우스를 올려 데이터 변환 정보를 확인하세요.

G1GC 상세 설명 (한국어)

1. G1GC의 기본 구조: 리전(Region)

G1GC는 기존의 Young/Old 영역 기반이 아닌, 힙을 크기가 같은 수많은 리전(Region)으로 나눕니다. 이 리전은 필요에 따라 Young (Eden/Survivor), Old, 또는 Humongous 영역의 역할을 수행합니다. 이 구조 덕분에 GC가 힙 전체를 스캔하지 않고, 가장 효율적인 리전(가장 많은 가비지가 있는 리전)을 먼저 청소하여 **"Garbage First"**라는 이름이 붙었습니다.

2. 목표: 최대 일시 정지 시간 (Pause Time Target)

G1GC의 핵심 목표는 사용자가 설정한 최대 일시 정지 시간(Max Pause Time Target)을 지키는 것입니다. GC는 이 목표 시간을 달성하기 위해, 청소할 리전들 중에서 가비지 회수에 걸리는 시간이 가장 적게 걸릴 것으로 예상되는 리전들을 선택하여 컬렉션 셋(CSET)을 구성합니다.

3. Young GC (Minor GC)

Young GC는 **Stop-The-World (STW)** 단계입니다. Eden과 Survivor 리전에서 진행되며, 새로 생성된 객체 중 살아있는 객체들을 다른 Survivor 리전이나 Old 리전으로 이동(Evacuation)시킵니다. 이동 후, 기존의 Young 리전들은 **Empty(비어있음)** 상태로 재활용됩니다. G1GC는 이 Young GC 단계에서 CSET을 통해 이동하는 **동시에** 메모리를 압축(Compaction)합니다.

4. Concurrent Cycle (동시 사이클)

Old 리전의 사용량이 임계점(Initial Mark Threshold)을 넘으면 동시 사이클이 시작됩니다. 이 사이클은 애플리케이션 스레드와 **동시에** 진행되어 STW 시간을 최소화합니다.

  • 초기 마킹 (Initial Mark): STW 단계. 힙의 루트(GC Root)에서 직접 참조되는 객체들만 마킹합니다. 이 단계는 Young GC 도중에 함께 진행되어 별도의 STW 시간을 줄이는 경우가 많습니다.
  • 동시 마킹 (Concurrent Marking): STW 없이 애플리케이션과 동시에 Old 리전에 있는 객체의 생존 여부를 트래킹합니다. 이때 S.A.T (Snapshot-At-The-Beginning) 알고리즘을 사용하여 마킹 시작 시점의 스냅샷을 기준으로 작업합니다.
  • 리마크 (Remark):** 짧은 STW 단계. 동시 마킹 중에 변경된 사항을 최종적으로 반영하고, 필요 없는 객체를 제거합니다.
  • 클린업 (Cleanup): 짧은 STW 단계. 마킹이 완료된 후, 가비지만 남아있는 리전들을 식별하고 힙에서 제거합니다. 완전히 비어있는 리전은 즉시 Empty로 반환됩니다.

5. Mixed GC (복합 GC)

동시 사이클이 Old 리전에 가비지가 많음을 확인하면, G1GC는 Old 리전을 포함하여 GC를 수행하는 **Mixed GC** 단계를 시작합니다. 이 단계도 STW이며, Young GC와 동일하게 **CSET**에 포함된 Young 리전과 Old 리전의 **모든** 살아있는 객체를 새로운 Empty 리전으로 복사(Evacuate)하면서 압축을 수행합니다.

6. 휴먼저스 객체 처리 (Humongous Object Handling)

리전 크기의 50%를 초과하는 매우 큰 객체는 휴먼저스(Humongous) 리전에 할당됩니다. 이 객체들은 대부분 Young GC나 Mixed GC에서 처리되지 않고, 동시 마킹 단계에서 수집 대상이 될 수 있습니다.

데이터 변환 흐름 요약:

Eden/Survivor (Young GC) → 살아남은 객체는 To Space (새로운 Survivor/Old)로 이동 및 압축 → 기존 리전은 Empty로 변환.
Old (Mixed GC) → CSET에 선택 → 살아남은 객체는 To Space (새로운 Old)로 이동 및 압축 → 기존 리전은 Empty로 변환.