我有一个非常简单的'Hello world'类型的Web应用程序(Spring 3.2.1,Hibernate 4.1.9),用于停止/重新启动Web应用程序Tomcat 7.0.26
The following web applications were stopped (reloaded, undeployed), but their
classes from previous runs are still loaded in memory, thus causing a memory
leak (use a profiler to confirm):
/myapp
我采取了以下步骤: 启动了JVisualVM 右键单击Tomcat并选择“Heap Dump” 点击[heapdump]上的'OQL Console' 跑过这个问题:
select x from org.apache.catalina.loader.WebappClassLoader x
找到4个实例:
org.apache.catalina.loader.WebappClassLoader
已选择的“已启动”字段为“false” 右键单击“this”引用并单击“Show Nearest GC Root” 显示“未找到GC根”的对话框。
我错过了什么?任何帮助将不胜感激。 感谢。
答案 0 :(得分:5)
随着网络上的所有教程,显示您描述的确切过程,
当它返回'No GC Root'时可能会造成混淆。
但这是一件好事
这些教程错过了一个步骤,当查看WebappClassLoader列表时,单击右侧的“Compute Retained Size”链接
稍后(取决于堆的总大小),这将显示类似于以下内容的
保留值为0的行也状态为false且没有GC Root的ClassLoader。
这意味着它们已准备好运行JVM的下一次GC运行。
摘要:即使'tomcat leak Detection'显示泄漏,如果保留的大小为0,它没有泄漏,它只是等待GC删除它。
注意:在visualVM中触发GC并不总是将其删除。虽然它将被JVM本身触发的GC删除。
答案 1 :(得分:-4)
尝试从任务管理器进程关闭javaw.exe。