2D 시뮬레이션으로 보는 JVM 힙 메모리 관리
리전 위에 마우스를 올려 데이터 변환 정보를 확인하세요.
G1GC는 기존의 Young/Old 영역 기반이 아닌, 힙을 크기가 같은 수많은 리전(Region)으로 나눕니다. 이 리전은 필요에 따라 Young (Eden/Survivor), Old, 또는 Humongous 영역의 역할을 수행합니다. 이 구조 덕분에 GC가 힙 전체를 스캔하지 않고, 가장 효율적인 리전(가장 많은 가비지가 있는 리전)을 먼저 청소하여 **"Garbage First"**라는 이름이 붙었습니다.
G1GC의 핵심 목표는 사용자가 설정한 최대 일시 정지 시간(Max Pause Time Target)을 지키는 것입니다. GC는 이 목표 시간을 달성하기 위해, 청소할 리전들 중에서 가비지 회수에 걸리는 시간이 가장 적게 걸릴 것으로 예상되는 리전들을 선택하여 컬렉션 셋(CSET)을 구성합니다.
Young GC는 **Stop-The-World (STW)** 단계입니다. Eden과 Survivor 리전에서 진행되며, 새로 생성된 객체 중 살아있는 객체들을 다른 Survivor 리전이나 Old 리전으로 이동(Evacuation)시킵니다. 이동 후, 기존의 Young 리전들은 **Empty(비어있음)** 상태로 재활용됩니다. G1GC는 이 Young GC 단계에서 CSET을 통해 이동하는 **동시에** 메모리를 압축(Compaction)합니다.
Old 리전의 사용량이 임계점(Initial Mark Threshold)을 넘으면 동시 사이클이 시작됩니다. 이 사이클은 애플리케이션 스레드와 **동시에** 진행되어 STW 시간을 최소화합니다.
동시 사이클이 Old 리전에 가비지가 많음을 확인하면, G1GC는 Old 리전을 포함하여 GC를 수행하는 **Mixed GC** 단계를 시작합니다. 이 단계도 STW이며, Young GC와 동일하게 **CSET**에 포함된 Young 리전과 Old 리전의 **모든** 살아있는 객체를 새로운 Empty 리전으로 복사(Evacuate)하면서 압축을 수행합니다.
리전 크기의 50%를 초과하는 매우 큰 객체는 휴먼저스(Humongous) 리전에 할당됩니다. 이 객체들은 대부분 Young GC나 Mixed GC에서 처리되지 않고, 동시 마킹 단계에서 수집 대상이 될 수 있습니다.
데이터 변환 흐름 요약:
Eden/Survivor (Young GC) → 살아남은 객체는 To Space (새로운 Survivor/Old)로 이동 및 압축 → 기존 리전은 Empty로 변환.
Old (Mixed GC) → CSET에 선택 → 살아남은 객체는 To Space (새로운 Old)로 이동 및 압축 → 기존 리전은 Empty로 변환.