[exception] “java.lang.OutOfMemoryError : PermGen space”오류 처리

최근에 웹 응용 프로그램 에서이 오류가 발생했습니다.

java.lang.OutOfMemoryError : PermGen 공간

Tomcat 6 및 JDK 1.6에서 실행되는 일반적인 Hibernate / JPA + IceFaces / JSF 응용 프로그램입니다. 분명히 응용 프로그램을 몇 번 재배치 한 후에 발생할 수 있습니다.

그것을 일으키는 원인과 그것을 피하기 위해 무엇을 할 수 있습니까? 문제를 어떻게 해결합니까?



답변

해결책은 Tomcat이 시작될 때 이러한 플래그를 JVM 명령 행에 추가하는 것입니다.

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

Tomcat 서비스를 종료 한 다음 Tomcat / bin 디렉토리로 이동하여 tomcat6w.exe를 실행하면됩니다. “Java”탭에서 “Java 옵션”상자에 인수를 추가하십시오. “확인”을 클릭 한 다음 서비스를 다시 시작하십시오.

오류가 발생 하면 지정된 서비스가 설치된 서비스로 존재하지 않습니다 .

tomcat6w //ES//servicename

여기서 servicename 은 services.msc에 표시된 서버 이름입니다.

출처 : Eric의 Agile Answers 에 대한 orx의 의견 .


답변

보다 시도하는 -XX:MaxPermSize=128M것이 좋습니다 -XX:MaxPermGen=128M.

이 메모리 풀의 정확한 사용법을 알 수는 없지만 JVM에로드 된 클래스 수와 관련이 있습니다. (톰캣에 클래스 언로드를 활성화하면 문제를 해결할 수 있습니다.) 응용 프로그램이 실행시 클래스를 생성하고 컴파일하는 경우 기본보다 큰 메모리 풀이 필요할 가능성이 큽니다.


답변

여러 배포 후 발생하는 앱 서버 PermGen 오류는 컨테이너가 이전 앱의 클래스 로더에 보유한 참조에 의해 발생합니다. 예를 들어, 사용자 정의 로그 레벨 클래스를 사용하면 앱 서버의 클래스 로더가 참조를 보유하게됩니다. jmap 및 jhat과 같은 최신 (JDK6 +) JVM 분석 도구를 사용하여 앱에서 어떤 클래스가 계속 유지되는지 확인하고 사용을 재 설계 또는 제거하여 이러한 클래스 간 로더 누수를 감지 할 수 있습니다. 일반적인 용의자는 데이터베이스, 로거 및 기타 기본 프레임 워크 수준 라이브러리입니다.

참조 클래스 로더 누수 : 지칠대로 지친 “java.lang.OutOfMemoryError와 : PermGen 공간”예외 , 특히 그 후속 게시물을 .


답변

사람들이 흔히 저지르는 실수는 힙 공간과 permgen 공간이 동일하다고 생각하는 것입니다. 힙에 많은 공간이 남아 있지만 여전히 permgen의 메모리가 부족할 수 있습니다.

PermGen에서 OutofMemory의 일반적인 원인은 ClassLoader입니다. 클래스가 JVM에로드 될 때마다 클래스 로더와 함께 모든 메타 데이터가 PermGen 영역에 유지되며 클래스를로드 한 클래스 로더가 가비지 수집 준비가되면 가비지 수집됩니다. Classloader가로드 한 모든 클래스보다 메모리 누수가 발생하는 경우 메모리에 남아 두 번 반복하면 permGen의 메모리가 부족하게됩니다. 전형적인 예는 Tomcat의 Java.lang.OutOfMemoryError : PermGen Space입니다 .

이제이를 해결하는 두 가지 방법이 있습니다.
1. 메모리 누수의 원인을 찾거나 메모리 누수가있는 경우.
JVM의 PARAM를 사용하여 PermGen 공간의 2. 크기 증가 -XX:MaxPermSize-XX:PermSize.

자세한 내용은 Java 의 2 Java.lang.OutOfMemoryError 솔루션을 확인할 수도 있습니다 .


답변

-XX:MaxPermSize=128mSun JVM에 대해 명령 행 매개 변수 를 사용하십시오 (필요한 크기에 따라 128을 대체 함).


답변

시도 -XX:MaxPermSize=256m하고 지속되면 시도하십시오-XX:MaxPermSize=512m


답변

나는 추가 -XX: MaxPermSize = 128m 로 (당신이 가장 적합한 실험 할 수있다) VM 인수 내가 이클립스 IDE를 사용하고있다. 대부분의 JVM에서 기본 PermSize 는 약 64MB 로 프로젝트에 클래스가 너무 많거나 많은 수의 문자열이 있으면 메모리가 부족합니다.

일식의 경우 answer에 설명되어 있습니다.

1 단계 : 서버 탭 에서 Tomcat 서버를 두 번 클릭하십시오.

여기에 이미지 설명을 입력하십시오

2 단계 : Launch Conf를 열고-XX: MaxPermSize = 128m 기존 VM 인수 끝에 추가 합니다 .

여기에 이미지 설명을 입력하십시오