복붙노트

[SPRING] Tomcat에서 JPA, Hibernate 및 Spring을 사용하여 클래스 로더 누출을 피하는 방법

SPRING

Tomcat에서 JPA, Hibernate 및 Spring을 사용하여 클래스 로더 누출을 피하는 방법

오픈 J2EE 웹 템플리트는 wicket - Tomcat7 서블릿 컨테이너에서 실행되는 Spring과 Hibernate가있는 JPA. Maven 빌드 스크립트는 표준 방식으로 컴포넌트를 사용하는 것으로 보입니다.

그러나 Tomcat에서 배포 해제 될 때 응용 프로그램 클래스 로더 메모리 누수의 영향을받습니다.

Tomcat의 "Find Leaks"버튼은 누설을 확인합니다. VM 옵션 -XX : + HeapDumpOnOutOfMemoryError를 사용하여 Tomcat에 배포하면 생성 된 힙 덤프를 Eclipse Memory Analyzer Tool (MAT)을 사용하여 분석 할 수 있습니다. MAT는 java.util.logging.Level $ KnownLevel 클래스를 가비지 수집을 막는 범인으로 식별합니다.

KnownLevel 생성자를 디버깅하면 다음 스택 추적이 나타납니다.

Classloader의 누수가 두려운 경우 : "java.lang.OutOfMemoryError : PermGen space"예외가 올바르게 발생하면이 클래스 로더 누출이 예상됩니다.

이 문제를 피하기 위해 권장되는 방법은 무엇입니까? 아니면 대체 Spring / JPA가 될 것입니까? Tomcat에서 웹 애플리케이션 템플릿을 작성 하시겠습니까?

해결법

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

    1.Tomcat7 + OpenJPA2.4.1 + ValidationAPI1.x + hibernate-validator-5.2.1 + jboss-logging.jar에서 이와 동일한 webapp 메모리 누수가 발생했습니다.

    Tomcat7 + OpenJPA2.4.1 + ValidationAPI1.x + hibernate-validator-5.2.1 + jboss-logging.jar에서 이와 동일한 webapp 메모리 누수가 발생했습니다.

    문제는 실제로 jboss-logging.jar은 java.util.logging.Level 인스턴스의 하위 클래스를 생성합니다. jar가 J2EE 컨테이너에서 제공되지만 mywebapp / WEB-INF / lib 배포에서 발생하는 경우에는 문제가되지 않을 수도 있습니다. 서브 클래 싱을 비활성화하려면 패키지 포크를 만들었습니다. 문제가 없어졌으며 webapp 핫 재배포가 정상적으로 작동합니다.

    GC 루트 경로의 힙 덤프는 문제의 근원을 나타내며, JDKLevel 서브 클래스는 웹 애플리케이션을 메모리에 유지하고 곧 JVM은 PermGen 메모리가 부족합니다.

    this     - value: org.apache.catalina.loader.WebappClassLoader #2
     <- <classLoader>     - class: org.jboss.logging.JDKLevel, value: org.apache.catalina.loader.WebappClassLoader #2
      <- <class>     - class: org.jboss.logging.JDKLevel, value: org.jboss.logging.JDKLevel class JDKLevel
       <- levelObject     - class: java.util.logging.Level$KnownLevel, value: org.jboss.logging.JDKLevel #6
        <- [1]     - class: java.lang.Object[], value: java.util.logging.Level$KnownLevel #12
         <- elementData     - class: java.util.ArrayList, value: java.lang.Object[] #5160 (10 items)
          <- value     - class: java.util.HashMap$Entry, value: java.util.ArrayList #3532
           <- [0]     - class: java.util.HashMap$Entry[], value: java.util.HashMap$Entry #21639
            <- table     - class: java.util.HashMap, value: java.util.HashMap$Entry[] #280 (16 items)
             <- intToLevels (sticky class)     - class: java.util.logging.Level$KnownLevel, value: java.util.HashMap #375
    

    edit이 버그에 대해 생성 된 JBoss Jira 티켓 (https://issues.jboss.org/browse/JBLOGGING-118)

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

    2.예 : java.util.logging 이외의 로깅 프레임 워크 구성 로그백.

    예 : java.util.logging 이외의 로깅 프레임 워크 구성 로그백.

    로깅이 전혀 구성되지 않았거나 java.util.logging이 구성된 경우 jboss 로깅은 JDK 버그 Level.known을 통해 클래스 로더 누출을 생성하여 메모리가 누출 될 수 있습니다. jboss logging이 사용자 정의 java.util.logging.Level을 생성하는 질문에서 스택 추적을 참조하십시오.

  3. from https://stackoverflow.com/questions/18248502/how-to-avoid-classloader-leak-with-jpa-hibernate-and-spring-on-tomcat by cc-by-sa and MIT license