1. 개요

PermGen(Permanent Generation)은 JVM 기반 애플리케이션을 실행하기 위해 할당된 독특한 메모리 조각입니다. PermGen 오류java.lang.OutOfMemoryError 계열의 오류이며 리소스(메모리) 고갈을 나타냅니다.

이 빠른 사용방법(예제)에서는 java.lang.OutOfMemoryError : Permgen 공간 오류의 원인과 해결 방법을 살펴봅니다.

2. 자바 메모리 유형

JVM은 스택과 힙 의 두 가지 유형의 메모리와 함께 작동합니다 . 스택은 기본 유형 및 개체 주소를 저장하는 데만 사용됩니다. 대신 힙에는 개체 값이 포함됩니다. 메모리 오류에 대해 이야기할 때 항상 힙을 참조합니다. PermGen은 사실 힙 메모리의 일부이지만 JVM의 메인 메모리와는 다르게 분리되어 처리됩니다. 이해해야 할 가장 중요한 개념은 힙에 많은 사용 가능한 공간이 남아 있고 여전히 perm gen 메모리가 부족할 수 있다는 것입니다.

PermGen의 주요 범위는 Java 애플리케이션 런타임의 정적 콘텐츠를 저장하는 것입니다. 특히 여기에는 정적 메서드, 정적 변수, 정적 개체에 대한 참조 및 클래스 파일이 포함됩니다.

3. java.lang.OutOfMemoryError : PermGen

간단히 말해서 이 오류는 PermGen에 할당된 공간이 더 이상 개체를 저장할 수 없을 때 발생합니다. 이것은 PermGen이 동적으로 할당되지 않고 최대 용량이 고정되어 있기 때문에 발생합니다. 기본 크기는 64비트 버전 JVM의 경우 82Mb이고 이전 32비트 JVM의 경우 64Mb입니다.

PemGen 고갈의 가장 빈번한 이유 중 하나는 클래스 로더와 관련된 메모리 누수입니다. 실제로 PermGen에는 클래스 파일이 포함되어 있으며 클래스 로더는 Java 클래스 로드를 담당합니다. 클래스 로더 문제는 다양한 애플리케이션의 독립적 배치를 달성하기 위해 여러 클래스 로더가 인스턴스화되는 애플리케이션 서버에서 자주 발생합니다.

응용 프로그램이 배포 취소되고 서버 컨테이너가 하나 이상의 클래스에 대한 참조를 유지하면 문제가 발생합니다. 이런 일이 발생하면 클래스 로더 자체는 가비지 수집될 수 없으므로 PermGen 메모리가 클래스 파일로 가득 차게 됩니다. PermGen 고장의 또 다른 일반적인 이유는 애플리케이션이 배포 해제된 후에도 계속 실행되는 애플리케이션 스레드로 인해 메모리에 할당된 여러 개체가 유지되기 때문입니다.

4. 오류 처리

4.1. Right JVM 매개변수 조정

제한된 메모리 공간과 관련하여 가장 먼저 해야 할 일은 가능하면 해당 공간을 늘리는 것입니다. 특정 플래그를 사용하여 PermGen 공간의 기본 크기를 늘릴 수 있습니다. 수천 개의 클래스 또는 엄청난 수의 Java 문자열이 있는 대규모 애플리케이션에는 일반적으로 더 큰 PermGen 공간이 필요합니다. JVM 매개변수 를 사용하여 XX:MaxPermSize 는 이 메모리 영역에 할당할 더 큰 공간을 지정할 수 있습니다. 

JVM 플래그에 대해 언급했으므로 이 오류를 유발할 수 있는 자주 사용되지 않는 플래그에 대해서도 언급할 가치가 있습니다. Xnoclassgc JVM 매개변수는 JVM의 시작 부분에 지정된 경우 삭제될 엔티티 List에서 클래스 파일을 명시적으로 제거합니다. 응용 프로그램 수명 주기당 클래스를 수천 번 로드 및 언로드하는 최신 프레임워크와 응용 프로그램 서버에서 PermGen 공간이 매우 빠르게 고갈될 수 있습니다.

이전 버전의 Java에서 클래스는 힙의 영구적인 부분입니다. 즉, 일단 로드되면 메모리에 남아 있습니다. CMSClassUnloadingEnabled (Java 1.5의 경우 또는 Java 1.6의 경우 CMSPermGenSweepingEnabled ) JVM 매개변수 를 지정하여 클래스의 가비지 수집을 활성화할 수 있습니다. Java 1.6으로 작업하는 경우 UseConcMarkSweepGC 도 true로 설정해야 합니다. 그렇지 않으면 CMSClassUnloadingEnabled 인수가 무시됩니다. 

4.2. JVM 8+로 업그레이드

이러한 종류의 오류를 수정하는 또 다른 방법은 최신 버전의 Java로 업그레이드하는 것입니다. Java 버전 8부터 Permgen은 공간 크기를 자동으로 조정할 수 있고 죽은 클래스를 정리할 수 있는 고급 기능이 있는  Metaspace로 완전히 대체되었습니다 .

4.3. 힙 분석

메모리 누수가 발생하는 경우 제공된 솔루션으로는 충분하지 않습니다. 크기가 아무리 커도 메모리는 끝납니다. Metaspace조차도 사용 가능한 메모리 양이 제한되어 있습니다. 심층 HEAP 분석은 때때로 유일한 솔루션이며 VisualGC 또는 JPROFILER와 같은 도구로 수행할 수 있습니다.

5. 요약

이 짧은 글에서 우리는 PermGen 메모리의 목적과 힙 메모리의 주요 차이점을 보았습니다. 다음으로 java.lang.OutOfMemoryError : Permgen 오류의 의미와 어떤 특이한 경우에 트리거되는지 살펴보았습니다. 마지막 섹션에서는 이 독특한 문제를 해결하려고 할 때 사용할 수 있는 다양한 솔루션에 중점을 두었습니다.

Generic footer banner