내 웹 응용 프로그램에서 PermGen 공간을 채우고 OutOfMemoryError : PermGen 크기를 두 번 다시로드 한 후 메모리 누수를 추적하려고합니다. 이제는 Tomcat 인스턴스 전체를 멈추거나 시작할 수 있다는 것을 알았지 만 메모리 누수의 원인을 추적하려고합니다.Tomcat WebappClassloader가 가비지 수집되지 않음
이 기사는 http://java.dzone.com/articles/memory-leak-protection-tomcat으로, 응용 프로그램을 중지 한 후에 WebappClassLoader에 대한 미결 참조가 없어야합니다. 그러면 WebappClassLoader가 가비지 수집되지 않습니다. YourKit과 Memory Analyzer를 사용하여 제 3 자 라이브러리에서 일어나는 몇 가지 사례를 발견하고 수정했습니다.
두 도구 모두 GC 루트에서 개체 (WebappClassloader)까지의 경로가 없다고보고하지만 WebappClassloader는 여전히 가비지 수집되지 않습니다. 누구든지 전에 이런 걸 겪었습니까?
내가
Tomcat의 [JreMemoryLeakPreventionListener] (http://www.jarvana.com/jarvana/view/org/apache/tomcat/tomcat-catalina/7.0.0/tomcat-catalina-7.0.0-sources.jar)의 출처는 다음과 같습니다. ! /org/apache/catalina/core/JreMemoryLeakPreventionListener.java? format = ok) 'XML 구문 분석은 웹 애플리케이션 클래스 로더를 메모리에 고정 할 수 있습니다. 프로파일 러 (최소한 YourKit과 Eclipse MAT)는 이와 관련된 GC 루트를 식별하지 못하기 때문에 이것은 특히 까다 롭습니다. ' 그래서 나는 그것이 일어날 수 있음을 안다. 그러나 그것이 할 때 무엇을해야 하는가? –
YourKit이 더 이상 명백한 GC 루트를 표시하지 못하게 한 원인은 (YourKit, JConsole 등을 사용하여) GC를 강제 실행하고, 메모리 스냅 샷을 작성하고 거기에있는 자체 클래스를 검색하는 것입니다. 일반적으로 이러한 메소드는 원본에서 암시되었습니다 메모리 누출. –
고마워, 나는 이것을 시험해보고 결과를 알려줄거야! –