반응형
GC 로그를 읽으려면 우선 JVM 힙 구조와 GC 종류를 알아야 합니다.
자바 힙(Heap) 구조
자바 힙은 크게 Young Generation과 Old Generation으로 나뉩니다.
Young 영역은 다시 Eden과 두 개의 Survivor 영역(S0, S1)으로 나뉘죠.
힙 외부에는 Metaspace라는 공간도 있습니다.
+-----------------------------------------+
| Heap (Xmx) |
| +--------------+ +-----------------+ |
| | Young Gen | | Old Gen | |
| | (Eden + S0 + | | (Tenured) | |
| | S1) | | | |
| +--------------+ +-----------------+ |
+-----------------------------------------+
+-------------------------+
| Metaspace |
| (클래스 메타데이터 저장) |
+-------------------------+
Young GC (Minor GC)
- 대상: Young Generation(Eden + Survivor)
- 발생 조건: Eden이 꽉 찼을 때
- 동작:
- Eden에서 참조되지 않는 객체 제거
- 살아남은 객체는 Survivor로 이동
- Survivor에서 오래 살아남은 객체는 Old로 승격(Promotion)
- 특징:
- 자주 발생 (ms 단위)
- STW는 있으나 짧아서 사용자 체감 거의 없음
- 로그 예시:
- Pause Young (Allocation Failure) 200M->50M(2048M) 12.345ms
Full GC
- 대상: Young + Old + (필요 시) Metaspace 전체
- 발생 조건:
- Old Generation이 가득 찼을 때
- Metaspace가 임계치에 도달했을 때 (Metadata GC Threshold)
- System.gc() 같은 명시적 호출
- 동작:
- 모든 세대를 훑고 필요 시 Compaction(압축) 수행
- 메타스페이스도 청소
- 특징:
- 비용이 크고 오래 걸림 (수백 ms~수십 초)
- STW 시간 동안 서비스가 멈춤
- 로그 예시:
- Pause Full (Metadata GC Threshold) 214M->214M(2048M) 43012.7ms
비교 표
| 구분 | 대상 | 발생 | 조건 | 속도 |
| 영향Young GC (Minor GC) | Young Generation (Eden+Survivor) | Young 꽉 참 | 빠름 (ms) | 체감 거의 없음 |
| Full GC | Young + Old + Metaspace | Old/Metaspace 꽉 참, 명시적 호출 | 느림 (수백 ms~수십 초) | 서비스 지연·멈춤 |
이 사례에서의 의미
지금 로그에서는 Full GC가 “Metadata GC Threshold”라는 트리거로 발생하고 있습니다.
즉, Metaspace가 임계치에 도달해서 Old와 메타스페이스를 전부 뒤지는 대청소가 반복되는 상황입니다.
그래서 한 번 돌 때마다 수십 초씩 서비스가 멈춘 것입니다.
이렇게 넣으면 기존 GC 로그 분석 글의 흐름 속에서 Young과 Full의 차이가 직관적으로 전달되고, 초보자도 “아~ 이건 작은 청소, 이건 대청소구나” 하고 이해할 수 있습니다.
반응형