【发布时间】:2011-08-08 07:17:07
【问题描述】:
我正在尝试跟踪我的 Web 应用程序中的内存泄漏,这导致 PermGen 空间被填满并在几次重新加载后抛出 OutOfMemoryError: PermGen size。现在我知道我可以停止/启动整个 Tomcat 实例,但我正在尝试追查内存泄漏的原因。
我已经阅读了这篇文章http://java.dzone.com/articles/memory-leak-protection-tomcat,这表明我必须确保在停止我的应用程序后没有对 WebappClassLoader 的未完成引用,这将防止它被垃圾收集。使用 YourKit 和 Memory Analyzer,我发现了一些在 3rd 方库中发生的情况并修复了它们。
我现在处于两个工具都报告没有“从 GC 根到对象 (WebappClassloader) 的路径”的地步,但 WebappClassloader 仍然没有被垃圾收集!有没有人遇到过这种情况?
我使用的是 Tomcat 6.0.32
【问题讨论】:
-
Tomcat 的JreMemoryLeakPreventionListener 的来源提到“XML 解析可以将 Web 应用程序类加载器固定在内存中。这尤其令人讨厌,因为分析器(至少 YourKit 和 Eclipse MAT)没有识别任何与此相关的 GC 根。所以我知道它可能会发生,但是当它发生时该怎么办?
-
在 YourKit 未能显示任何更明显的 GC 根源后帮助我的东西是强制 GC(使用 YourKit、JConsole 等),拍摄内存快照并在那里搜索我们自己的任何类-- 这些通常暗示内存泄漏的来源。
-
谢谢,我会试一试,让你知道结果!
标签: tomcat garbage-collection classloader