【问题标题】:Tomcat WebappClassloader not garbage collectedTomcat WebappClassloader 没有被垃圾收集
【发布时间】: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


【解决方案1】:

抱歉,我之前没有解决这个问题...

我已经消除了 WebappClassloader 的所有 GC 根,但它只是没有被垃圾收集。我尝试强制垃圾收集,但无济于事。

问题在于调用Runtime.getRuntime().gc(); 并不能保证所有可能的东西都会被垃圾回收——只是JVM 会尽最大努力这样做。

在重新加载 Tomcat 几次之后,JVM 开始在 PermGen 空间上运行不足,WebappClassloader 确实被垃圾收集了。我假设 JVM 没有更早地对它进行 GC,因为它不需要。

【讨论】:

    猜你喜欢
    • 2014-08-08
    • 1970-01-01
    • 2017-01-24
    • 2013-10-18
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多