본문 바로가기

카테고리 없음

Young GC와 Full GC 차이, 그리고 힙 구조

반응형

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이 꽉 찼을 때
  • 동작:
    1. Eden에서 참조되지 않는 객체 제거
    2. 살아남은 객체는 Survivor로 이동
    3. 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의 차이가 직관적으로 전달되고, 초보자도 “아~ 이건 작은 청소, 이건 대청소구나” 하고 이해할 수 있습니다.

반응형