복붙노트

[SPRING] OutOfMemoryError : PermGen Space - Tomcat에서 실행중인 Spring의 Jasper 보고서

SPRING

OutOfMemoryError : PermGen Space - Tomcat에서 실행중인 Spring의 Jasper 보고서

우리의 웹 어플리케이션은 복잡한 상황에 처하게됩니다.

STS / Tomcat 7에서 개발 한 스프링 애플리케이션이다. 애플리케이션이 Jasper 보고서 4.6.0과 통합 된 후에는 항상 OutOfMemoryError : PermGen Space를 발생시킨다. 그런 다음 응용 프로그램을 다시 시작하는 것이 유일한 방법입니다. 그러나 잠시 후 다시 발생합니다. 다음은 예외 이전의 로그입니다.

Oct 17, 2012 3:42:27 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Oct 17, 2012 3:42:30 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception

다음은 Jasper에 관한 무언가를 발견 한 예외 영역입니다.

at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:442)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:240)
at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:578)
at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:49)
at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:655)

다음은 상황이 발생할 때의 몇 가지 결과입니다.

나는 몇 가지 연구를했지만 여전히이 문제에 대한 해결책을 찾을 수 없습니다.

일반적으로,이 스레드는 단지 probelm에 대한 해결책을 찾아내는 것 뿐이며, Jasper가 왜 그렇게 적극적인지에 대한 답변을 요구하지 않으며, tomcat이 템플릿을 올바르게 구문 분석하도록 할 수있는 방법을 찾으십시오.

너무 자세한 경우 사과하고 힌트를 주셔서 감사합니다.

해결법

  1. ==============================

    1.이 문제에 대한 해결책을 제공 해주신 모든 분들께 감사 드리며, 제 상황과 관련된 문제를 구체적으로 확인했습니다. 해결책은 다음과 같습니다.

    이 문제에 대한 해결책을 제공 해주신 모든 분들께 감사 드리며, 제 상황과 관련된 문제를 구체적으로 확인했습니다. 해결책은 다음과 같습니다.

    템플릿으로 .jrxml 대신 .jasper를 사용하십시오!

    우리가 아는 것처럼 .jasx는 템플릿을위한 .jrxml뿐만 아니라, 템플릿을위한 ASCII 소스 코드이기 때문에, 현재 스프링 애플리케이션에서 원시 소스 코드 파일 (jrxml)을 템플릿으로 사용한다면 적어도 스프링 프레임 작업은 소스를 컴파일해야한다. 코드 파일. 이것은 컴파일을 처리하는 재 스퍼 빈 (jasper bean)이므로 스프링 프레임 워크에 남아있는 효율성의 문제이며 응용 프로그램을 시작할 때만 실행되는 컴파일을 보장하지 않습니다.

    즉, 모든 템플릿을 .jasper 파일로 바꾸면 로그 크기가 크게 줄어들어 더 이상 메모리 부족 문제가 발생하지 않습니다. 내 생각에 스프링 컨테이너는 jrxml을 런타임시 재스퍼로 컴파일하기 위해 많은 리소스를 소비 할 수도 있습니다. 재스퍼 (Jasper) 나 스프링 (Spring)이 개선해야 할 것이 있습니다.

  2. ==============================

    2.예외는 JVM의 permgen 공간에 너무 많은 .class 파일이있어 AppClassLoader 외부의 오브젝트에 대한 참조로 인해 가비지 수집 될 수없는 경우 발생합니다. 그것은 일반적으로 일부 메모리 누수가 귀하의 applciation 지적한다.

    예외는 JVM의 permgen 공간에 너무 많은 .class 파일이있어 AppClassLoader 외부의 오브젝트에 대한 참조로 인해 가비지 수집 될 수없는 경우 발생합니다. 그것은 일반적으로 일부 메모리 누수가 귀하의 applciation 지적한다.

    이 게시물에는 java.lang.OutOfMemoryError에 대한 설명이 있습니다 : PermGen 공간 오류 및 다음 게시물은 오류 수정 방법에 대한 제안 사항이 있습니다. 당신이 그것을 놓쳤는지를 알려주는 유사한 (그러나 정확히 같은 것은 아닙니다) 질문이 SO에 대해 질문되었습니다. 도움이되기를 바랍니다.

    jakub이 -XX : + CMSClassUnloadingEnabled -XX : + CMSPermGenSweepingEnabled 설정을 언급했거나 XX 값을 더 높게 설정했기 때문에 MaxPermSize가 도움이 될 수 있습니다. 그러나 내가 읽은 것에서 볼 때 영구적 인 해결책은 아닙니다. (나는이 마스터가 아니다 :)).

  3. ==============================

    3.VM에서이 매개 변수를 설정해보십시오. 이것들은 permGen을 GC 청소해야합니다.

    VM에서이 매개 변수를 설정해보십시오. 이것들은 permGen을 GC 청소해야합니다.

    -XX:+UseConcMarkSweepGC
    -XX:+CMSPermGenSweepingEnabled
    -XX:+CMSClassUnloadingEnabled
    
  4. ==============================

    4.나는 JasperReports 4.5.1을 사용하는 웹 애플리케이션을 개발했다.

    나는 JasperReports 4.5.1을 사용하는 웹 애플리케이션을 개발했다.

    Tomcat 6.0.26을 컨테이너로 사용합니다. (Win7, JDK 1.6.0_25)

    바람둥이를 종료하면 다음과 같이 처리됩니다.

    웹 응용 프로그램은 유형 [net.sf.jasperreports.engine.util.JRFontUtil $ 1] (값 [net.sf.jasperreports.engine.util.JRFontUtil$1@7892f1])의 키와 유형 [java .util.HashSet] (값 [[]])을 사용하지만 웹 응용 프로그램이 중지되었을 때이를 제거하지 못했습니다. 이렇게하면 메모리 누수가 발생할 가능성이 큽니다.

    웹 사이트를 방문하십시오 :

    http://community.jaspersoft.com/questions/534340/memory-leak-jr-373

  5. ==============================

    5.PermGen에는 주로 클래스 메타 데이터와 상수 및 내부 문자열이 포함되어 있으므로 두 가지 방향으로 검색 할 수 있습니다.

    PermGen에는 주로 클래스 메타 데이터와 상수 및 내부 문자열이 포함되어 있으므로 두 가지 방향으로 검색 할 수 있습니다.

    실제로, 사용중인 Java 버전을 지정하지 않았습니다. Java 7에서는 문자열이 문제가되지 않을 수 있습니다.

    VisualGC 플러그인을 사용하여 JVisualVM을 사용하여 응용 프로그램을 관찰하여 세대의 상태,로드 된 클래스 수 및 OOM 시간에 급증 여부 또는 느린 빌드인지 여부를 확인합니다. -쪽으로.

  6. from https://stackoverflow.com/questions/12943030/outofmemoryerror-permgen-space-jasper-report-with-spring-running-on-tomcat by cc-by-sa and MIT license