Java의 GC(Garbage Collection)는 JVM이 불필요한 객체를 자동으로 제거하여 메모리를 회수하는 기능이다. 이 작업을 수행하는 방식에는 여러 가지 GC 알고리즘이 존재하며, 각각의 특성과 목적에 따라 선택이 달라진다.


1. GC 기본 용어

  • Young Generation: 새롭게 생성된 객체들이 위치. 대부분의 객체는 이 영역에서 생성되고 빠르게 소멸함
  • Old (Tenured) Generation: Young 영역을 통과한 생명 주기가 긴 객체들이 위치
  • Metaspace (구 PermGen): 클래스 메타정보가 저장되는 영역
  • Stop-the-World: GC가 실행되기 위해 JVM의 모든 쓰레드를 멈추는 현상

2. 주요 GC 알고리즘 비교

알고리즘 동작 방식 장점 단점 적합한 환경
Serial GC 단일 스레드로 처리 단순함, 오버헤드 낮음 멀티코어 활용 불가, STW 길어짐 테스트/소규모 시스템
Parallel GC 여러 스레드로 Young GC 수행 Throughput 좋음 STW 길 수 있음 배치 처리, 대량 처리 중심
CMS Old GC 병행 처리 (Concurrent Mark-Sweep) 짧은 응답 시간 메모리 조각화, 종료 단계 STW 응답 지연 민감한 시스템
G1GC Heap을 Region으로 나눠 동시 관리 예측 가능한 GC 시간, 큰 힙에 강함 초기 튜닝 필요 대규모 서버, 최신 시스템
ZGC 매우 낮은 STW 시간, 병렬/동시 처리 중심 실시간 응답에 적합 최신 JVM 필요 대용량, 응답 지연 불허 환경
Shenandoah ZGC와 유사, OpenJDK 기반 낮은 지연 시간 실험적일 수 있음 지연이 매우 민감한 앱

3. GC 선택 가이드

GC 알고리즘 지원 JDK 버전 특징 요약
Serial GC 1.2 이상 가장 단순하고 모든 JVM에 존재
Parallel GC 1.4 이상 Throughput 위주, JDK 8까지 기본
CMS 1.5 ~ 14 STW 짧지만 JDK 15에서 제거됨
G1GC 7 이상, 9부터 기본 Region 기반, 예측 가능한 GC 시간
ZGC 11 이상, 15부터 안정화 초저지연, 실시간 환경에 적합
Shenandoah 12 이상 (OpenJDK 한정) OpenJDK용 저지연 GC
Epsilon 11 이상 GC를 하지 않음 (측정용)

JDK 버전별 기본 GC 요약

JDK 버전 기본 GC
8 이하 Parallel GC
9 ~ 13 G1GC
14 ~ 17 G1GC
18 이상 G1GC (향후 ZGC 기본 검토 중)
  • 개발/테스트 환경: Serial GC
  • 일반적인 웹 서비스: G1GC, 또는 Parallel GC
  • 실시간 응답형 시스템 (게임 등): ZGC, Shenandoah
  • 대량 데이터 배치/백엔드 서버: Parallel GC, G1GC

GC는 JVM 옵션으로 지정할 수 있다. 예시:

-XX:+UseG1GC
-XX:+UseParallelGC
-XX:+UseZGC

4. 참고 JVM 옵션

옵션 설명
-Xms<size> 초기 힙 사이즈
-Xmx<size> 최대 힙 사이즈
-XX:+PrintGCDetails GC 상세 로그 출력
-Xloggc:<file> GC 로그 파일 경로 지정
-XX:+UseCompressedOops 객체 포인터 압축 (기본값)

이 글은 각 GC 알고리즘의 특성과 목적을 파악해, 시스템 특성에 맞는 GC를 선택할 수 있도록 돕기 위한 기초 정리입니다.

+ Recent posts