자바의 GC(Garbage Collection) 는 JVM 성능과 메모리 관리의 핵심 요소라서, 시대별로 큰 변화를 겪어왔습니다. 흐름을 정리하겠습니다.
🕰️ 자바 GC 변천사
1. Serial GC (초기, JDK 1.2~)
- 단일 스레드 기반 → 작은 애플리케이션에 적합
- Stop-The-World 시간이 길어 대규모 서비스에는 부적합
- 구조: Young/Old 세대 분리, Mark-Sweep-Compact 방식
2. Parallel GC (JDK 1.4~)
- 멀티코어 활용 → Young/Old 세대 수집을 병렬화
- Throughput Collector 라고도 불림
- 대규모 서버 환경에서 기본 선택지로 자리잡음
3. CMS (Concurrent Mark-Sweep, JDK 1.5~)
- Stop-The-World 시간을 줄이기 위해 동시 마킹/스위핑 도입
- 응답 지연(latency)에 민감한 서비스에 적합
- 단점: Fragmentation 발생, Full GC 비용 큼
- JDK 9 이후 Deprecated → JDK 14에서 완전 제거
4. G1 GC (Garbage First, JDK 7~)
- Region 기반 메모리 관리 (Heap을 여러 Region으로 나눔)
- Predictable Pause Time 목표 → 짧고 일정한 GC 지연 제공
- CMS 대체로 자리잡음, JDK 9 이후 기본 GC
5. ZGC (JDK 11~)
- 초저지연 GC (Pause Time < 10ms 목표)
- 수십 GB~TB 규모 Heap에서도 안정적
- Colored Pointer, Load Barrier 기법 사용
- JDK 15부터 Linux/Windows/macOS 지원
6. Shenandoah GC (JDK 12~)
- Red Hat 주도 개발
- Concurrent Compaction → GC 중에도 객체 이동 가능
- Pause Time 최소화, 대규모 메모리 환경에 적합
📊 요약 비교
| GC | 특징 | 장점 | 단점 |
|---|
| Serial | 단일 스레드 | 단순, 소규모 적합 | 대규모 환경 부적합 |
| Parallel | 멀티스레드 | Throughput ↑ | Pause Time 길음 |
| CMS | Concurrent Mark-Sweep | Pause Time ↓ | Fragmentation, Deprecated |
| G1 | Region 기반 | 예측 가능한 Pause | 튜닝 복잡 |
| ZGC | 초저지연 | TB급 Heap 지원 | 최신 JVM 필요 |
| Shenandoah | Concurrent Compaction | Pause 최소화 | 상대적 성능 오버헤드 |
👉 결론적으로, 과거에는 Throughput 중심(Parallel, CMS) 이었지만, 최근에는 저지연 중심(G1, ZGC, Shenandoah) 으로 발전했습니다. 특히 ZGC와 Shenandoah는 대용량 AI 시스템이나 실시간 서비스에서 가장 많이 쓰이는 최신 GC입니다.