Tomcat WebappClassloader没有垃圾收集

时间:2011-08-08 07:17:08

标签: tomcat garbage-collection classloader

我正在尝试追踪我的Web应用程序中的内存泄漏,导致PermGen空间填满并在重新加载几次后抛出OutOfMemoryError:PermGen大小。现在我知道我可以停止/启动整个Tomcat实例,但我正在尝试追踪内存泄漏的原因。

我已经阅读了这篇文章http://java.dzone.com/articles/memory-leak-protection-tomcat,它表明我必须确保在停止我的应用程序后,应该没有对WebappClassLoader的未完成引用,这将阻止它被垃圾收集。使用YourKit和Memory Analyzer我发现了几个在第三方库中发生并修复它们的情况。

我现在正处于这两个工具报告没有“从GC根到对象的路径(WebappClassloader)”这一点,但WebappClassloader仍然没有被垃圾收集!以前有人遇到过这样的事吗?

我正在使用Tomcat 6.0.32

1 个答案:

答案 0 :(得分:1)

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

我已经消除了所有GC根到WebappClassloader,但它只是没有被垃圾收集。我试图强制垃圾收集,但没有用。

问题在于调用Runtime.getRuntime().gc();并不能保证所有可能的内容都被垃圾收集 - 只有JVM会尽最大努力才能这样做。

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