GC 개요
| 항목 |
CMS GC |
G1 GC |
| 전체 이름 |
Concurrent Mark Sweep GC |
Garbage First GC |
| 기본 전략 |
세대 구분 (Young / Old) + 병행 수집 |
Region 기반 + 논리적 세대 구분 + 병행 수집 + compact |
| STW(Stop-The-World) |
일부 발생 (Young GC, Initial Mark 등) |
일부 발생 (Young GC, Remark 등) |
| 단편화 해소 |
❌ 없음 |
✅ 있음 (Evacuation + Compaction) |
| JVM 옵션 |
-XX:+UseConcMarkSweepGC |
-XX:+UseG1GC (JDK 9 이상 기본값) |
| 대상 영역 |
고정된 Young/Old Generation |
논리적 Young/Old, Region 기반 동적 분할 |
CMS GC 상세 동작
구조
Heap
├── Young Generation
│ ├── Eden
│ └── Survivor (S0, S1)
└── Old Generation
동작
- Minor GC (Young 영역): ParNew GC가 수행 (Copying 방식)
- Major GC (Old 영역): CMS가 수행
- Initial Mark (STW)
- Concurrent Mark (병행)
- Remark (STW)
- Concurrent Sweep (병행)
- ✅ Compact 없음 → 단편화 발생 가능
장점
- Major GC 중 대부분 병행 수행
- GC pause 시간 짧음 (Throughput보다는 latency 중심)
단점
- 단편화 발생: Compact 단계 없음 → Old 영역에서 연속 공간 부족 시 Full GC 강제 발생
- 병행 수행 중 애플리케이션 스레드와 경쟁 → 성능 불안정
- 메타스페이스는 GC 대상 아님 → CMS는 PermGen 시절의 GC 정책에 기반
- 개발 중단됨 (deprecated): JDK 14에서 완전 제거
G1 GC 상세 동작
구조 (Region 기반)
Heap: 수백 개의 동일 크기 Region
├── Eden Region
├── Survivor Region
├── Old Region
├── Humongous Region
- 각 Region은 역할이 동적으로 할당됨
- Eden, Survivor, Old 구분은 논리적
동작
- Young GC (Minor GC)
- Eden → Survivor로 복사 (Copying GC)
- STW 발생
- Old GC (Mixed GC)
- Young + 일부 Old 영역을 함께 GC
- Mark 단계는 병행 수행:
- Initial Mark (STW)
- Concurrent Mark
- Remark (STW)
- Cleanup (선택된 Region만)
- Copy (Evacuation, STW)
장점
- 단편화 자동 해결 (Region 단위 이동 + Compacting)
- GC 대상 영역을 부분 선택 가능 → 성능 예측 용이
- GC pause 시간 예측 가능 (
-XX:MaxGCPauseMillis=200 등)
- 서버 환경에서 기본값 (JDK 9부터 기본 GC)
단점
- JVM 힙이 작을 경우 오히려 비효율적일 수 있음
- 매우 짧은 pause time 요구엔 ZGC, Shenandoah가 더 우수함
CMS의 문제점 정리
| 문제 |
설명 |
| 단편화 발생 |
Compact 단계가 없어 Old 영역에 조각난 메모리만 남음 |
| Full GC 발생 |
단편화가 심하면 Promotion 실패 → Full GC로 이어짐 |
| 성능 예측 어려움 |
GC 시간과 간섭이 불규칙함 |
| Deprecated |
JDK 9에서 deprecated, JDK 14에서 완전 제거됨 |
왜 G1이 CMS를 대체했는가?
| 항목 |
이유 |
| 단편화 해결 |
G1은 Region을 이동시키며 자동 압축(Compaction)을 수행 |
| GC 시간 예측 가능 |
MaxGCPauseMillis 등으로 GC pause 시간 조정 가능 |
| 안정성 |
병행/병렬 처리 균형 잡힌 구조 + 고성능 서버에 최적화 |
| 유지보수성 |
Oracle이 공식 지원하는 GC, CMS는 더 이상 관리되지 않음 |
| 기본 GC |
JDK 9부터 서버용 JVM의 기본 GC로 채택됨 |
✅ 결론 요약
- CMS는 저지연 애플리케이션에 적합했지만, 단편화 문제, Full GC 발생 위험, Deprecated 등의 이유로 점차 퇴출됨
- G1 GC는 이를 보완하여 부분 GC + 병행 + 압축 + 예측 가능한 GC 시간을 제공
- 현대 JVM에서는 G1이 CMS를 완전히 대체함