我正在尝试追踪我的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
答案 0 :(得分:1)
抱歉,我之前没有解决这个问题......
我已经消除了所有GC根到WebappClassloader,但它只是没有被垃圾收集。我试图强制垃圾收集,但没有用。
问题在于调用Runtime.getRuntime().gc();
并不能保证所有可能的内容都被垃圾收集 - 只有JVM会尽最大努力才能这样做。
在重新加载Tomcat几次之后,JVM开始在PermGen空间上运行不足,WebappClassloader确实被垃圾收集了。我假设JVM之前没有GC,因为它不需要。