문제

표준 리프트 플랫폼 (Maven and Jetty)에서 개발 중입니다. 나는 반복적으로 (며칠마다) 이것을 얻는다 :

Exception in thread "7048009@qtp-3179125-12" java.lang.OutOfMemoryError: PermGen space
2009-09-15 19:41:38.629::WARN:  handle failed
java.lang.OutOfMemoryError: PermGen space

이것은 내 개발 환경에 있습니다. 서버를 계속 다시 시작할 수 있기 때문에 문제가되지 않습니다. 배포시 이러한 문제가 없으므로 실제 문제가 아닙니다. 나는 단지 궁금합니다.

나는 JVM에 대해 너무 많이 모른다. 영구적 인 세대 기억이 수업 및 인턴 끈과 같은 것들을위한 것이라고 생각하는 것이 맞다고 생각합니다. 내가 기억하는 것은 .NET 메모리 모델과 약간 혼합 된 것입니다 ...

이것이 일어나고있는 이유가 있습니까? 불이행이 미친 듯이 낮습니까? Scala가 기능 객체 및 유사한 FP를 위해 만들어야하는 모든 보조 객체와 관련이 있습니까? 새로 쓰여진 코드로 부두를 다시 시작할 때마다 (몇 분마다) 클래스 등을 다시로드하는 것을 상상합니다. 그러나 그럼에도 불구하고 많은 사람들이 할 수 없습니까? 그리고 JVM이 많은 수업을 다룰 수 없어야합니까?

건배

도움이 되었습니까?

해결책

에서 이 게시물:

이 예외는 한 가지 간단한 이유로 발생했습니다.
그만큼 permgenspace 방법, 필드, 주석 및 정적 변수 등과 같은 클래스 속성이 Java VM에 저장되는 곳이지만,이 공간은 가비지 수집기에 의해 청소되지 않는 특수성이 있습니다. 따라서 WebApp이 많은 클래스를 사용하거나 생성하는 경우 (동적 세대의 클래스를 생각하고 있습니다),이 문제를 충족시킬 가능성이 있습니다. 다음은이 예외를 제거하는 데 도움이되는 몇 가지 솔루션입니다.

  • -XX:+CMSClassUnloadingEnabled :이 설정은 Permgenspace에서 쓰레기 수집을 가능하게합니다
  • -XX:+CMSPermGenSweepingEnabled : 쓰레기 수집가가 메모리에서 클래스를 제거 할 수 있습니다.
  • -XX:PermSize=64M -XX:MaxPermSize=128M : permgenspace에 할당 된 메모리 양을 높입니다.

이것이 도움이 될 수 있습니다.

2012 년 7 월 편집 (거의 3 년 후) :

Ondra žižka 댓글 (그리고 위의 답변을 업데이트했습니다) :

JVM 1.6.0_27 말한다 : 사용하십시오 :

  • CMSClassUnloadingEnabled (CMS GC를 사용할 때 클래스 언 로딩이 가능한지 여부)
  • 대신에 CMSPermGenSweepingEnabled 미래에

전체를 참조하십시오 핫스팟 JVM 옵션 - 전체 참조 Mroe를 위해.

다른 팁

실행할 때 이것을 볼 수 있다면 mvn jetty:run, 설정 MAVEN_OPTS.

Linux 용 :

export MAVEN_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run

Windows :

set "MAVEN_OPTS=-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"
mvn jetty:run

이제 괜찮을 것입니다. 그렇지 않다면 증가하십시오 -XX:MaxPermSize.

이를 환경에 영구적으로 배치 할 수도 있습니다.

  • Linux의 경우 추가하십시오 export 라인으로 ~/.bashrc

  • Windows의 경우 누릅니다 Win-key + PrintScreen, 그리고 가십시오 Advanced > Environment. 또한보십시오 http://support.microsoft.com/kb/310519.

이것은 당신이 제안한대로 클래스를 다시로드하기 때문입니다. 많은 라이브러리 등을 사용하는 경우 등급의 합계는 각각의 재시작에 대해 빠르게 증가합니다. Reloading시 메모리 소비에 대한 개요를 얻으려면 VisualVM으로 부두 인스턴스를 모니터링하십시오.

메일 링리스트 (http://groups.google.com/group/liftweb/)는 리프트의 공식 지원 포럼이며 더 나은 답변을 얻을 수있는 곳입니다. 나는 당신의 DEV 설정의 세부 사항을 모르지만 (당신은 자세히 설명하지 않습니다), 실제로 그것을 다시 시작하지 않고 Jetty에서 전쟁을 다시로드하고 있다고 가정합니다. 리프트는 동적 클래스 생성을 수행하지 않지만 (위의 Vonc에서 제안한대로) Scala는 각 폐쇄를 별도의 클래스로 컴파일합니다. 며칠 동안 코드의 폐쇄를 추가하고 제거하는 경우 너무 많은 클래스가로드되고 하역되지 않고 파마 공간을 차지할 수 있습니다. 위의 Vonc에서 언급 한 옵션 JVM 옵션을 활성화하고 도움이되는지 확인하십시오.

영구 세대는 JVM이 맞춤형 클래스 로더처럼 수집되지 않을 것 (쓰레기)을 넣는 물건을 넣는 곳입니다.

배포중인 내용에 따라 파마 설정이 낮을 수 있습니다. 일부 응용 프로그램 및/또는 컨테이너 조합에는 일부 메모리 누출이 포함되어 있으므로 앱이 배치되지 않으면 때로는 클래스 로더와 같은 일부 물건이 수집되지 않아 파마 공간을 채우므로 발생하는 오류가 발생합니다.

불행히도, 현재이 경우 가장 좋은 옵션은 다음 JVM 플래그 (192m Perm Size의 예)로 Perm Space를 최대화하는 것입니다.

-XX:MaxPermSize=192M (or 256M)

다른 옵션은 컨테이너 또는 프레임 워크가 메모리 누출되지 않도록하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top