반응형
Metaspace란 무엇일까
- Metaspace는 JDK8 이전의 Perm 영역을 대체하는 것으로 클래스와 메소드의 메타데이터들이 저장되는 영역임
- Metaspace는 native memory를 사용하기 때문에 힙 영역과는 별개의 영역에 할당됨
- native memory는 프로세스에 할당되는 메모리 영역으로 C 힙과 스레드 스택도 native memory를 사용함
다음 그림을 보면 좀 더 쉽게 이해할 수 있다.
클래스는 최초에 모두 로딩되는 것은 아니고 필요 시점에 로딩되며,
클래스가 로딩될 때 Metaspace에 클래스 정보가 저장된다.
- 소스 코드양이 많아질수록 Metaspace도 그만큼 많이 사용되게 됨
- 보통 클래스 하나당 5~6KB 정도 사용된다고 함
- 그리고 GC 실행 시 저장된 클래스 정보가 unload 될 수도 있음 (그 클래스 객체들이 일단 없어야 함)
Metaspace 최대 크기는 다음 JVM 옵션으로 지정할 수 있다.
-XX:MaxMetaspaceSize=256m
지정하지 않으면 제한을 두지 않게 된다.
다음 옵션은 최초 GC가 발생하게하는 크기이다. (최초 Metaspace 크기아님)
-XX:Metaspace=256m
클래스 로딩 현황 확인 방법
다음 명령어로 클래스 로드 현황을 출력할 수 있음 (명령 실행 시 Stop the world 될 수 있기 때문에 주의, 그런데 실제로 해보니 순식간에 완료된다)
jcmd $PID GC.class_stats
# -csv=true 옵션을 추가하면 csv형태로 출력
단, JVM에 다음 옵션이 추가되어있어야 가능함
-XX:+UnlockDiagnosticVMOptions
출력 결과 예시
24078:,,,,,,,,,,,,,, Index,Super,InstBytes,KlassBytes,annotations,CpAll,MethodCount,Bytecodes,MethodAll,ROAll,RWAll,Total,ClassName,ClassName,
1,-1,45152104,480,0,0,0,0,0,24,584,608,[C,[C,1
2,-1,18656168,480,0,0,0,0,0,24,584,608,[B,[Ljava.lang.Object;,1
3,-1,18364176,480,0,0,0,0,0,24,584,608,[Ljava.lang.Object;,java.lang.reflect.Method,1
4,17199,10089728,1112,0,5600,40,847,21328,4224,24496,28720,java.lang.reflect.Method,[B,1
5,34,5632288,568,0,1376,8,223,1744,1032,2976,4008,java.util.concurrent.ConcurrentHashMap$Node,java.util.concurrent.ConcurrentHashMap$Node,1
6,34,5622864,624,0,8784,94,4623,56304,12144,54648,66792,java.lang.String,java.lang.String,1
...
...
JVM 프로세스 메타스페이스 사용량 확인 방법
jstat -gc <pid>
# 반복 출력 : jstat -gc <pid> <interval(mills)>
출력 결과 예시
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
78592.0 78592.0 0.0 3311.0 629248.0 22288.4 1310720.0 310770.2 143360.0 130739.8 16896.0 14725.5 2311 22.155 0 0.000 22.155
출력 항목의 의미
- S0C: Current survivor space 0 capacity (kB).
- S1C: Current survivor space 1 capacity (kB).
- S0U: Survivor space 0 utilization (kB).
- S1U: Survivor space 1 utilization (kB).
- EC: Current eden space capacity (kB).
- EU: Eden space utilization (kB).
- OC: Current old space capacity (kB).
- OU: Old space utilization (kB).
- MC: Metaspace capacity (kB).
- MU: Metacspace utilization (kB).
- CCSC: Compressed class space capacity (kB).
- CCSU: Compressed class space used (kB).
- YGC: Number of young generation garbage collection events.
- YGCT: Young generation garbage collection time.
- FGC: Number of full GC events.
- FGCT: Full garbage collection time.
- GCT: Total garbage collection time.
반응형
'개발 > 자바' 카테고리의 다른 글
JPA N+1 문제와 해결 방법 (0) | 2022.09.16 |
---|---|
JVM 트러블 슈팅 및 분석을 위한 명령어들 (0) | 2021.03.08 |
sun.reflect.GeneratedMethodAccessor 클래스에 대해서 (0) | 2020.10.13 |
자바 성능을 결정짓는 코딩 습관과 튜닝 이야기 (0) | 2020.06.09 |
Effective Java 3/E - 8장 메서드 요약정리 (0) | 2019.05.26 |