개요
G1GC(Garbage-First Garbage Collector)는 자바 가상 머신(JVM)의 가비지 컬렉션 알고리즘 중 하나이다. 대규모 힙 메모리를 효율적으로 관리하고 가비지 컬렉션으로 인한 지연 시간을 최소화하기 위해 설계되었다. G1GC는 힙 메모리를 여러 리전(region)으로 나누어 관리하며, 가비지가 많은 리전을 우선적으로 수집하는 방식으로 동작한다.
주요 특징
- 메모리 분할
- G1GC는 힙 메모리를 동일한 크기의 리전으로 나누어 관리한다. 각 리전은 독립적으로 수집되며, 전체 힙을 한 번에 처리하는 방식보다 효율적이다.
- 우선 수집
- G1GC는 가비지가 많을 것으로 예상되는 리전을 우선적으로 수집한다. 이를 통해 가비지 컬렉션의 효율성을 높이고 애플리케이션의 일시 정지 시간을 줄인다.
- 병렬 및 동시 처리
- G1GC는 여러 스레드를 사용하여 가비지 컬렉션 작업을 병렬로 수행한다. 일부 작업은 애플리케이션 스레드와 동시에 진행된다.
G1GC의 설계 이유
- 메모리 단편화 감소: 고정 크기의 리전으로 힙을 나누어 관리함으로써 단편화를 줄인다.
- 수집 우선순위 설정: 리전별로 살아있는 데이터의 양을 기준으로 우선순위를 설정하여 가장 효과적인 리전부터 수집한다.
- 부분적인 힙 정리 가능: 전체 힙 대신 일부 리전만 선택적으로 수집하여 일시 정지 시간을 제어한다.
G1GC의 목표
G1GC의 핵심 목표는 예측 가능한 짧은 일시 정지 시간을 유지하는 것이다. 이를 위해 모든 단계는 설정된 목표 일시 정지 시간을 초과하지 않도록 설계되었다. 이는 대규모 애플리케이션에서 응답성과 성능의 균형을 유지하는 데 기여한다.
G1GC의 단계
Initial Mark
Initial Mark 단계는 Old 영역의 객체 중 GC 루트와 연결된 객체를 마킹하는 과정이다. 이 단계는 Stop-the-World(STW) 상태에서 수행된다. Eden 영역의 객체가 Young GC를 통해 이동할 때 함께 처리된다.
- 이유
- 초기 참조 그래프를 설정하여 이후 단계에서 마킹 작업을 이어가기 위한 기반을 마련하기 위함이다. 빠른 처리를 통해 일시 정지 시간을 최소화한다.
Concurrent Mark
Concurrent Mark 단계는 애플리케이션이 실행 중일 때 Old 영역의 객체를 스캔하여 살아있는 객체를 식별한다. 각 리전의 살아있는 데이터 양을 계산한다.
- 이유
- 애플리케이션 실행을 방해하지 않고 대부분의 마킹 작업을 처리하기 위함이다. 이 정보를 활용하여 우선적으로 수집할 리전을 결정한다.
Remark
Remark 단계는 Concurrent Mark 이후 참조 그래프의 업데이트를 반영하여 최종적으로 살아있는 객체를 확인하는 과정이다. 이 단계는 STW 상태에서 수행된다.
- 이유
- 정확한 데이터를 확보하여 효율적인 가비지 수집을 수행하기 위함이다.
Cleanup
Cleanup 단계는 가비지로 식별된 리전을 정리하고 수집 우선순위를 계산하는 단계이다. 이 정보는 Mixed GC 단계에서 활용된다.
- 이유
- 메모리 단편화를 줄이고 가장 효과적인 리전부터 수집하기 위한 준비를 하기 위함이다.
Young GC
Young GC는 Eden 영역이 가득 차면 트리거된다. 살아남은 객체는 Survivor 영역 또는 Old 영역으로 이동한다. 이 단계는 STW 상태에서 수행된다.
- 이유
- Eden 영역은 주로 단명 객체가 위치하는 공간으로, 주기적으로 비워야 메모리 부족을 방지할 수 있다.
Mixed GC
Mixed GC는 Young 영역과 일부 Old 영역을 함께 수집하는 과정이다. 가비지가 많은 리전을 우선적으로 수집하며 병렬로 진행된다.
- 이유
- Old 영역의 가비지를 주기적으로 정리하여 메모리 사용량을 줄이고 성능을 유지하기 위함이다.