Java Metaspace에 대해서

Metaspace란 무엇일까

  • Metaspace는 JDK8 이전의 Perm 영역을 대체하는 것으로 클래스와 메소드의 메타데이터들이 저장되는 영역임
  • Metaspace는 native memory를 사용하기 때문에 힙 영역과는 별개의 영역에 할당됨
  • native memory는 프로세스에 할당되는 메모리 영역으로 C 힙과 스레드 스택도 native memory를 사용함

다음 그림을 보면 좀 더 쉽게 이해할 수 있다.

[출처 :  https://www.programmersought.com/article/4905216600/]

 

클래스는 최초에 모두 로딩되는 것은 아니고 필요 시점에 로딩되며,
클래스가 로딩될 때 Metaspace에 클래스 정보가 저장된다.

 

[출처 :  https://stuefe.de/posts/metaspace/what-is-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.