본문 바로가기

Programming Language/Java & Scala

Java PermGen의 역사

오늘은 Java PermGen에 대해서 알아보겠습니다. PermGen은 JDK 1.7 이하 버젼에서 존재하였습니다. 이곳은 클래스 메타 데이터가 들어갈 곳인데, 이 공간의 크기는 예측하기가 어려웠습니다. 자바에서는 클래스의 메타데이터를 읽고 해당 메타데이터를 통해 객체를 생성할 수 있습니다.

클래스 메타데이터란? : 클래스의 이름, 생성정보, 필드정보, 메서드 정보 등

 그 때문에 아래와 같은 에러가 종종 일어나곤 했습니다.

java.lang.OutOfMemoryError: PermGen space

 

PermGen영역은 OS, JVM버젼마다 각기다른 default값을 가지고 있으며 대부분 매우 작게 할당되어 있었습니다.

 

그렇기 때문에 클래스 로딩을 많이하다보면 PermGen이 부족할때 위와 같은 에러가 발생할 수도 있습니다. 이를 위해 아래와 같이 설정하곤 했습니다.

-XX:PermSize=128m -XX:MaxPermSize=128m

 

위와 같이 설정하고, 추후에 추가로 용량이 필요할때는 늘릴때도 있지만 이건 임시방편이였습니다.

 

JDK 1.8부터 PermGen영역이 없으며 Metaspace로 완벽하게 대체되었습니다.

 

Metaspace는 클래스 메타 데이터를 native메모리에 저장하고 부족할경우 자동으로 늘려주게 됩니다. 이로 인해 더이상 PermSize, MaxPermSize를 설정할 필요가 없어졌고, MetaspaceSize나 MaxMetaspaceSize가 새롭게 사용되게 되었습니다.

 

만약 MaxMetaspaceSize를 등록하지 않으면 Native memory자원을 최대한 사용하게 됩니다.(Default jvm MaxMetaspaceSize =  None)

태그