반응형
안녕하세요! 재아군의 관찰인생 입니다.
운영 서버에서 응답 지연, CPU 스파이크, OutOfMemoryError가
발생했다면 가장 먼저 확인해야 할 것이 바로 GC 로그입니다.
특히 요즘 Spring Boot + JDK 17 환경에서 기본값으로 많이 사용하는
G1GC는 로그 패턴을 이해하면 장애를 사전에 감지할 수 있습니다.

G1GC란?
- 공식 문서
https://docs.oracle.com/en/java/javase/17/gctuning/garbage-first-g1-garbage-collector1.html - G1GC는 JDK 9 이후 기본 GC로 채택된 서버 지향 Garbage
Collector입니다. - Heap을 Region 단위(1~32MB)로 나누어 관리하며, Pause Time 예측
가능성을 목표로 설계되었습니다. - Young GC → Mixed GC → 필요 시 Full GC 순으로 동작합니다.
다른 GC와의 비교
GC 동작 방식 장점 단점 추천 환경
| Serial GC | 단일 스레드 | 단순 | 서버 부적합 | 테스트 |
| Parallel GC | Throughput 중심 | 처리량 높음 | Pause 길 수 있음 | Batch |
| CMS | Low Pause | 실시간성 | Deprecated | 구버전 |
| G1GC | Region 기반 | 균형형 | 로그 해석 필요 | 대부분 서버 |
| ZGC | Low Latency | 초저지연 | 메모리 요구 큼 | 대규모 트래픽 |
GC 로그 활성화 방법
JDK 11+
-XX:+UseG1GC
-Xlog:gc*:file=gc.log:time,uptime,level,tags
JDK 8
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
Young GC 로그 예시
[2.345s][info][gc] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 256M->128M(512M) 15.678ms
해석
| 항목 | 의미 |
| 2.345s | JVM 시작 후 경과 시간 |
| GC(5) | 5번째 GC |
| Pause Young | Young 영역 GC |
| 256M->128M | GC 전/후 사용량 |
| (512M) | 전체 Heap |
| 15.678ms | Pause Time |
정상 패턴: - 10~50ms 내외 - 일정 주기 반복 - Old 영역 급증 없음
Mixed GC 예시
[45.123s][info][gc] GC(23) Pause Young (Mixed) 380M->200M(512M) 32.456ms
- Young + Old 일부 정리
- Old 영역 증가 신호
Full GC 예시 (위험 신호)
[120.456s][info][gc] GC(78) Pause Full (G1 Compaction Pause) 490M->300M(512M) 1.245s
위험 포인트: - 1초 이상 Pause - Old 영역 포화 가능성 - Humongous 객체
의심
실전 시나리오
1. 응답 지연
- Full GC 1초 이상
- Old 90% 이상 점유
조치: - Heap 증가 - 캐시 정책 점검 - Heap Dump 분석
2. CPU 스파이크
- Young GC 초당 2~3회
- Pause 30~40ms 반복
조치: - 객체 생성 패턴 최적화 - Stream 과다 사용 점검
3. OOM 직전 패턴
- GC 연속 발생
- Heap 감소 거의 없음
조치:
jmap -dump:live,format=b,file=heap.hprof <pid>
Eclipse MAT 분석 권장
핵심 튜닝 옵션
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=30
-XX:G1HeapRegionSize=8m
FAQ
Q. G1GC는 항상 최선인가요?
A. 대부분 서버 환경에 적합하지만 초저지연이면 ZGC 고려.
Q. Heap 크기 권장 기준은?
A. Peak 메모리의 1.3~1.5배.
GC 로그는 서버의 건강 진단서입니다. 패턴을 이해하면 장애를 예방할 수 있습니다.
2026.02.17 - [개발&프로그래밍] - [Gradle GC] 가비지 컬렉터 설정 방법 - 빌드 시간의 숨은 병목, GC 튜닝으로 9~20% 추가 개선
2026.02.17 - [개발&프로그래밍] - [JVM] [OutOfMemoryError 해결] - 원인 분석부터 완벽 해결까지 실전 가이드
반응형
'개발&프로그래밍' 카테고리의 다른 글
| [Gradle GC] 가비지 컬렉터 설정 방법 - 빌드 시간의 숨은 병목, GC 튜닝으로 9~20% 추가 개선 (0) | 2026.02.20 |
|---|---|
| [Gradle] 빌드 속도 개선 방법 - 느린 빌드, 설정 하나로 50~70% 단축하기 (0) | 2026.02.19 |
| [SpringBoot] 로그 잘림 해결 방법 - 콘솔 / 파일 로그 길이 제한 완전 정리 (0) | 2026.02.19 |
| [JVM] [OutOfMemoryError 해결] - 원인 분석부터 완벽 해결까지 실전 가이드 (0) | 2026.02.18 |
| [Codex] 프롬프트 작성법 - Codex를 200% 활용하는 비법 완전 가이드 (0) | 2026.02.18 |
댓글