자바 가비지 컬렉터(GC) 동작 원리

2024. 8. 29. 22:08개발노트

1. 가비지 컬렉션(GC)의 개념

자바의 GC는 힙(Heap) 메모리에서 더 이상 참조되지 않는 객체를 찾아 자동으로 삭제하는 프로세스

개발자가 직접 메모리를 해제할 필요가 없어 메모리 누수 방지에 결정적인 역할을 한다.

2. 메모리 구조와 영역 분리 (Young vs Old)

GC는 대부분의 객체는 금방 사라진다는 가설을 바탕으로 효율성을 위해 힙 영역을 나누어 관리한다.

  • Young Generation: 객체가 처음 생성되는 곳. 청소가 빈번하며 속도가 빠름 (Minor GC)
    • Eden / Survivor 0 / Survivor 1로 세분화됨
  • Old Generation: Young 영역에서 오래 살아남은 객체들이 이동함. 덩치가 커서 청소 시간이 더 걸림 (Major GC)

3. GC의 핵심 동작: Mark and Sweep

모든 GC 알고리즘의 뼈대는 다음 3단계를 따른다.

  1. Mark (표시): 메모리를 뒤져 사용 중인 객체와 아닌 객체를 식별
  2. Sweep (삭제): 참조되지 않는 쓰레기 객체를 메모리에서 제거
  3. Compact (압축): 제거 후 남은 빈 공간을 채우기 위해 객체들을 한곳으로 모아 메모리 파편화를 방지

핵심 개념: Stop-the-world (STW) GC 실행을 위해 앱의 모든 스레드가 잠시 멈추는 현상, 이 멈춤 시간을 줄이는 것이 GC 성능 최적화의 본질이다.


4. 현재 주로 사용하는 GC 종류

자바 버전과 시스템 목적에 따라 선택지가 달라진다.

Parallel GC

  • 특징: 여러 스레드를 사용해 청소하며 '처리량' 극대화에 집중
  • 현황: 자바 8의 기본값임. 최신 버전에서도 응답 속도보다 대량 데이터 처리가 중요한 배치(Batch) 시스템에서 여전히 사용

G1 GC (Garbage First)

  • 특징: 메모리를 바둑판 형태의 Region(리전)으로 나눔. 쓰레기가 가장 많은 구역을 우선순위로 청소
  • 현황: 자바 9부터 현재(Java 21 등)까지의 표준 기본 GC임. 대부분의 API 서버 환경에 최적화되어 있음

ZGC

  • 특징: '유색 포인터' 기술을 사용해 힙 크기에 상관없이 멈춤 시간(STW)을 10ms 이하로 억제
  • 현황: 초저지연이 필수인 대규모 시스템이나 고성능 서비스에서 채택이 늘고 있음

단순히 최신 버전을 쓰는 것에 그치지 않고, 서비스의 성격(처리량 vs 응답 속도)에 맞춰 적절한 GC 옵션을 설정하는 것이 중요