[JVM] PERM 영역 이해하기

2021. 12. 16. 12:26 JAVA/JVM

펌 영역에서 OOME(Out Of Memory Error)가 발생하면 아래와 같이 로그가 남는다

펌( PERM : Permanent Generation) 영역은 객체의 생명주기가 영구적일 것으로 생각하는 객체들을 관리한다. 이 영역은 GC대상에서 제외된다. 주로 자바의 Class 객체들이나 문자열에 속한 String 객체들이 위치한다.

Class 객체들은, 시스템의 Classpath에 잡힌 객체들 또는 사용자에 의해 다이나믹하게 로드되는 클래스들이 있다. Spring같은 프레임워크들은 다이나믹하게 사용자가 정의한 클래스 정보를 로드한다. 주로 이 때 다이나믹하게 로드되는 클래스들에 의해 PERM영역의 OOME가 발생한다.

어떤 클래스 정보를 로드할 때, 해당 클래스의 정보만 로드하는 것이 아니라,  클래스에 연관된 다른 클래스들도 같이 로드되고 펌 영역에 할당된다

DaoFactory와 같이 싱글톤 방식으로 하나만 생성해서 어플리케이션이 동작하는 동안 유지되어야 하는 객체들이 있다. 주로 이러한 객체들이 코딩실수로 여러개 생성되어 PERM 영역에서 자리를 많이 차지할 경우 OOME가 발생한다.

PERM OOME 예
 

Java의 Reflection 기능을 이용하거나 이용하거나 Spring이나 MyBatis와 같은 프레임워크를 사용하는 경우는 메모리에 대한 고려를 하여 설계를 하여야 한다.