【发布时间】:2015-11-18 20:30:35
【问题描述】:
我有一个使用 hibernate 3.6.4 和 spring 3.2.4(mvc、tx 和安全性)并在 tomcat 7 中运行的 Web 应用程序。每次我在不重新启动 tomcat 的情况下部署我的应用程序的新版本时,然后tomcat使用的内存增加了大约50MB。
我创建了一些堆转储并使用 Eclipse 内存分析器对其进行了分析。我发现每次重新部署应用程序时,都会创建一个新的 WebappClassLoader 实例。但即使在我使用 tomcat 管理器停止应用程序之后,WebappClassLoader 仍保留在内存中并且不会被垃圾收集。 因此,每次重新部署后,都会有一个额外的 WebappClassLoader 保留在内存中并使用大约 50MB 的内存。
我使用 Eclipse 内存分析器来查找从 WebappClassLoader 到 GC 根的引用路径。结果,我找不到任何可以阻止 WebappClassLoaders 被垃圾收集的强引用。
那么,是什么让 WebappClassLoaders 保持活力?为了找出阻止 WebappClassLoader 进行垃圾收集的原因,我还能在哪里进行调查?
我认为可能存在阻止 GC 完成垃圾回收的阻塞 finalize() 方法。但是我怎么检查这个呢?
【问题讨论】:
-
你在tomcat7中使用org.apache.catalina.core.JreMemoryLeakPreventionListener
-
@awsome 是的,我愿意。据我了解,在 tomcat 7 中默认启用 JreMemoryLeakPreventionListener。默认 server.xml 包含以下条目:
<!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
标签: java memory-leaks tomcat7 classloader eclipse-memory-analyzer