2011-08-08 3 views
3

내 웹 응용 프로그램에서 PermGen 공간을 채우고 OutOfMemoryError : PermGen 크기를 두 번 다시로드 한 후 메모리 누수를 추적하려고합니다. 이제는 Tomcat 인스턴스 전체를 멈추거나 시작할 수 있다는 것을 알았지 만 메모리 누수의 원인을 추적하려고합니다.Tomcat WebappClassloader가 가비지 수집되지 않음

이 기사는 http://java.dzone.com/articles/memory-leak-protection-tomcat으로, 응용 프로그램을 중지 한 후에 WebappClassLoader에 대한 미결 참조가 없어야합니다. 그러면 WebappClassLoader가 가비지 수집되지 않습니다. YourKit과 Memory Analyzer를 사용하여 제 3 자 라이브러리에서 일어나는 몇 가지 사례를 발견하고 수정했습니다.

두 도구 모두 GC 루트에서 개체 (WebappClassloader)까지의 경로가 없다고보고하지만 WebappClassloader는 여전히 가비지 수집되지 않습니다. 누구든지 전에 이런 걸 겪었습니까?

내가

+0

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 루트를 식별하지 못하기 때문에 이것은 특히 까다 롭습니다. ' 그래서 나는 그것이 일어날 수 있음을 안다. 그러나 그것이 할 때 무엇을해야 하는가? –

+0

YourKit이 더 이상 명백한 GC 루트를 표시하지 못하게 한 원인은 (YourKit, JConsole 등을 사용하여) GC를 강제 실행하고, 메모리 스냅 샷을 작성하고 거기에있는 자체 클래스를 검색하는 것입니다. 일반적으로 이러한 메소드는 원본에서 암시되었습니다 메모리 누출. –

+0

고마워, 나는 이것을 시험해보고 결과를 알려줄거야! –

답변

1

미안이 이전 ...

내가 WebappClassloader에 GC 뿌리를 모두 제거했다가 해결되지 않는 톰캣 6.0.32을 사용하고 있지만, 그냥되지 않는 한 garbage- 모은. 쓰레기 수거를 강요했지만 아무 소용이 없습니다.

문제는 Runtime.getRuntime().gc();을 호출한다고해서 가능한 모든 것이 가비지 수집된다는 보장이 없다는 것입니다. 단지 JVM이 최선을 다할 것입니다.

Tomcat을 몇 번 다시로드 한 후 JVM의 PermGen 공간이 부족하기 시작하여 WebappClassloader가 실제로 가비지 수집되었습니다. 나는 JVM이 이전에 GC를하지 않았다고 가정했기 때문에 이전에 GC를하지 않았다.

관련 문제