我有一个使用 hibernate 3.6.4 和 spring 3.2.4(mvc、tx 和安全性)并在 tomcat 7 中运行的 Web 应用程序。每次我在不重新启动 tomcat 的情况下部署我的应用程序的新版本时,然后使用的内存tomcat 增加了大约 50MB。
我创建了一些堆转储并使用 Eclipse Memory Analyser 对其进行了分析。我发现每次重新部署应用程序时,都会创建一个新的 WebappClassLoader 实例。但即使在我使用 tomcat 管理器停止应用程序之后,WebappClassLoader 仍保留在内存中并且不会被垃圾收集。因此,每次重新部署后,都会在内存中保留一个额外的 WebappClassLoader 并使用大约 50MB 的内存。
我使用 Eclipse 内存分析器来查找从 WebappClassLoader 到 GC 根的引用路径。结果,我找不到任何可以阻止 WebappClassLoaders 被垃圾收集的强引用。
那么,是什么让 WebappClassLoaders 保持活力呢?我还能在哪里调查以找出阻止 WebappClassLoader 进行垃圾收集的原因?
我认为可能存在阻止 GC 完成垃圾收集的阻塞 finalize() 方法。但我怎么能检查这个?