본문 바로가기
트러블슈팅/MW

[웹로직] OutOfMemoryError: Metaspace에 대한 고찰

by sangyeon 2021. 8. 24.
728x90

OutOfMemoryError에는 여러 가지 종류가 있습니다.
아래 오라클 공식 문서 참조
Understand the OutOfMemoryError Exception
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html

 

Understand the OutOfMemoryError Exception

Cause: The detail message Java heap space indicates object could not be allocated in the Java heap. This error does not necessarily imply a memory leak. The problem can be as simple as a configuration issue, where the specified heap size (or the default si

docs.oracle.com

이번에는 그 중에서도 Metaspace 영역의 OutOfMemory에 대한 내용을 설명하려고 합니다.

1. MetaSpace란?

MetaSpace는 Non-heap으로 시스템 메모리이다. (Java 8 이후부터 생긴 개념)

MetaSpace는 클래스 메타데이터를 저장하는데 사용하는 Native 영역의 메모리입니다.
메타데이터는 클래스 정의에 대한 정보(클래스의 이름/ 생성자 정보/ 필드 정보/ 메서드 정보)를 제공합니다.
즉, MetaSpace는 Java의 ClassLoader가 현재까지 로드한 Class들의 메타데이터가 저장되는 공간입니다.
일반적으로 Class를 무한정 생성하는 경우는 많이 없기 때문에 MetaSpace OutOfMemory가 발생하는 경우에는 대부분 메모리 할당량을 늘려주는 것으로 해결되지만 간혹 서드파티 Libarary들이 Class들을 양산하고 있을 수 있다.
주로 Scala, Kotlin 등이 제공하는 Command Line Compiler, REPL(Read Eval Print Loop)를 내부적으로 활용하거나 Runtime Compiler 또는 ScriptEngine을 사용한 어플리케이션, Javassist와 같은 Dynamic Class Generation을 활용한 어플리케이션을 긴 시간 동안 서비스할 때 많이 발생합니다.

2. MetaSpace 영역 할당하는 방법
JVM 옵션으로 아래와 같이 설정합니다.
-XX:MetaspaceSize=512m
-XX:MaxMetaspaceSize=512m
가끔 MaxMetaSpaceSize를 설정을 안하는 곳도 있는데, 해당 설정은 반드시 해주어야 합니다.

(타사 사례를 보았을 때 Max를 설정하지 않은 경우 GC가 일어나지 않아 메타데이터의 메모리가 OOME가 떨어졌던 이슈가 있었음)

3. MetaSpace가 할당되는 시점
MetaSpace는 클래스가 로드되는 경우 클래스 로더에 의해 할당되어 클래스의 메타데이터를 저장합니다.
그렇기 때문에 소스 코드의 양이 많을수록 대게 MetaSpace도 그만큼 많이 사용하게 됩니다.
보통 클래스 하나당 5~6K 정도의 메타데이터 사이즈를 가지고 있습니다.

출처 : https://stuefe.de/posts/metaspace/what-is-metaspace/


4. MetaSpace가 메모리 회수하는 시점
할당된 MetaSpace 영역은 클래스 로더에 로드된 모든 클래스에서 더 이상 Active한 인스턴스(해당 클래스로 생성된 객체가 없어야 함)가 없고 이러한 해당 클래스 로더에 대한 참조가 없으며 GC가 실행된 이 후에만 회수됩니다.

출처 : https://stuefe.de/posts/metaspace/what-is-metaspace/


5. JVM 프로세스 데타데이터 사용량 모니터링
$ jstat -gc [pid] [interval_ms]

[weblogic@sydev syDomain01]/usr/java/java8_64/bin/jstat -gc 20643 3000
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
56832.0 56832.0 0.0 56828.5 235520.0 137747.0 349696.0 86693.2 105600.0 103802.7 12416.0 12017.5 7 0.274 1 0.128 0.403
56832.0 56832.0 0.0 56828.5 235520.0 137747.0 349696.0 86693.2 105600.0 103802.7 12416.0 12017.5 7 0.274 1 0.128 0.403

> MC: Metaspace capacity (kB)
> MU: Metacspace utilization (kB)



728x90