GC와 성능의 “직접 연결 고리”
자바에서 성능이란?
- TPS
- 응답시간(latency)
- 타임아웃
- 순간 멈춤
이 중 GC가 직접 깨는 건 딱 하나입니다.
👉 응답시간 (latency)
1️⃣ G1 / ZGC / CMS 차이
■ CMS (Concurrent Mark Sweep)
구세대, “멈춤 줄이려다 관리 지옥 간 GC”
- Old 영역을 **동시(concurrent)**로 마킹
- Stop-The-World 최소화 목적
- 단점
- 메모리 단편화 심각
- Full GC 발생 시 재앙
- 튜닝 난이도 높음
- 현실
- Java 8 레거시에서만 존재
- 이미 사장됨 (Deprecated → Removed)
👉 “옛날에 썼다” 정도만 알면 됨
■ G1 (Garbage First)
현실적 표준, 공공·SI의 기본값
- 힙을 Region 단위로 쪼갬
- Garbage가 많은 Region부터 수거
- Pause 목표 기반 GC
(-XX:MaxGCPauseMillis) - 장점
- 예측 가능한 Pause
- 대용량 힙(수 GB~수십 GB)에 안정적
- 단점
- Throughput은 Parallel GC보다 떨어짐
- 설정 과신하면 오히려 느려짐
👉 “조절 가능한 현실형 GC”
■ ZGC
최신, “Pause가 거의 사라진 GC”
- Pause 수 ms 이하 (1~10ms)
- Load Barrier + Colored Pointer
- 힙 크기 수백 GB도 가능
- 장점
- 초저지연
- Full GC 개념 사실상 없음
- 단점
- JVM/OS 요구사항 높음
- CPU·메모리 오버헤드
- 운영 경험 부족
- 현실
- 금융·대규모 플랫폼
- 공공·SI에서는 아직 과함
👉 “설명은 하되, 남용은 금물”
📌 GC 선택 감각
- Java 8 공공 SI → G1
- Java 17 이상, 초저지연 → ZGC
- CMS → 레거시 설명용
2️⃣ Eden / Survivor / Old 개념
■ Young Generation 구조
Eden → Survivor(S0/S1) → Old
■ Eden
- 객체 처음 생성
- 대부분 여기서 죽음
- Minor GC 대상
■ Survivor (S0 / S1)
- Eden에서 살아남은 객체 임시 보관
- GC마다 Ping-Pong 이동
- 여기서 일정 횟수 생존 시 Old 승격
■ Old Generation
- 장수 객체
- Full / Mixed GC 대상
- 여기서 GC 터지면 체감 성능 급락
핵심 실무 포인트
- 성능 문제 = Old에 객체가 쌓이는 구조
- Eden GC는 자주 발생해도 정상
- Old GC가 잦으면 설계 실패
3️⃣ JVM 옵션: -Xms / -Xmx / MaxGCPauseMillis
■ -Xms (초기 힙)
- JVM 시작 시 힙 크기
- 너무 작으면 → 초반 GC 폭증
- 실무: -Xms = -Xmx 권장
■ -Xmx (최대 힙)
- JVM이 쓸 수 있는 최대 메모리
- 무작정 키우면:
- Full GC 한 번에 서버 멈춤
- OS 메모리 압박
👉 “힙 크기는 성능이 아니라 리스크”
■ -XX:MaxGCPauseMillis
- G1의 목표값
- “이 시간 안에 끝내려고 노력하겠다”는 선언
- 보통 100~200ms
⚠️ 주의
- 낮게 잡으면 → GC 빈도 증가
- 높게 잡으면 → Pause 길어짐
👉 절대값 보장 아님
4️⃣ 이걸 다 안다는 의미 (중요)
이 3가지를 안다는 건:
- GC 로그를 읽을 수 있다
- GC 때문에 느린지 판단할 수 있다
- 옵션으로 완화는 가능
❌ 하지만:
- 성능을 “통제”하진 못함
- 구조가 나쁘면 GC는 무조건 터짐
5️⃣ 실무자 한 줄 요약
GC는 튜닝 대상이 아니라, 설계 결과다.
옵션은 마지막에 만지는 소화제다.
LIST
'Spring & Backend' 카테고리의 다른 글
| 동시성 버그는 재현이 아니라 운의 문제다 (0) | 2026.02.02 |
|---|---|
| 추상화는 힘이다. 하지만 과하면 미래의 디버깅 비용이다 (0) | 2026.02.02 |
| GC를 모르면 성능을 논하지 말고, GC를 알면 성능을 과신하지 마라 (0) | 2026.02.02 |
| try-with-resources에 대해 설명해 주세요. (0) | 2026.02.02 |
| 인증과 인가에 대해 설명해주세요. (0) | 2026.01.30 |
