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를 선택할 수 있도록 돕기 위한 기초 정리입니다.