我试图跟踪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

最佳答案

抱歉,我没有解决此问题...

我已经将所有GC根目录都删除了,但没有将它收集到WebappClassloader中。我试图强行进行垃圾收集,但无济于事。

问题是调用Runtime.getRuntime().gc();不能保证所有可能的东西都会被垃圾回收-只是JVM将尽最大努力做到这一点。

在重新加载了Tomcat几次之后,JVM开始在PermGen空间上运行不足,WebappClassloader确实被垃圾回收了。我认为JVM不会早些时候进行GC,因为它不需要。

09-30 18:46