language/java

Java PermGen 영역

아르르르를를르 2022. 3. 20. 12:44

PermGen(Permanent Heap)은 Java 8 버전 이하에서 존재했다. 클래스 메타데이터가 들어갈 곳인데 이 공간의 크기를 예측하기 어려웠다.

자바에서는 클래스의 메타데이터(class 메타정보, Method의 메타정보, static변수, 상수정보)를 읽고 해당 메타데이터를 통해 객체를 생성할 수 있다.

PermGen 영역은 OS, JVM버전마다 각기 다른 default값을 가지고 있으며 대부분 매우 작게 할당되어 있어  java.lang.OutOfMemoryError와 같은 에러를 접할 수 있다. PermSize를 commandline에서 늘릴 수 있으나 임시방편이다.

 

Java 8 버전에서는 PermGen 영역이 Metaspace로 대체되었다. Metaspace는 Native memory에 속하며 부족할 경우 자동으로 늘려준다.

MaxMetaspaceSize = None가 default 이므로 따로 설정하지 않으면 Native memory의 사용영역이 무한히 늘어나서 Memory swap이 일어날 수 있다. swap이 시작되면 application은 현저히 속도가 느려지니 장애상황과 다름없다고 볼 수 있다.

 

 

 

참고: https://blog.voidmainvoid.net/315