permgen,但是Java VisualVM说“找不到GC根”

时间:2013-06-13 20:11:05

标签: tomcat7 permgen jvisualvm

我有一个非常简单的'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根”的对话框。

我错过了什么?任何帮助将不胜感激。 感谢。

2 个答案:

答案 0 :(得分:5)

随着网络上的所有教程,显示您描述的确切过程,

  1. 使用VisualVM,
  2. 搜索WebappClassLoader,
  3. 查找'started'等于false的那些。
  4. 点击“显示最近的GC根”
  5. 当它返回'No GC Root'时可能会造成混淆。

    但这是一件好事

    这些教程错过了一个步骤,当查看WebappClassLoader列表时,单击右侧的“Compute Retained Size”链接

    visualVM showing link to compute retained sizes

    稍后(取决于堆的总大小),这将显示类似于以下内容的

    visualVM showing retained sizes

    保留值为0的行状态为false且没有GC Root的ClassLoader。

    这意味着它们已准备好运行JVM的下一次GC运行。

    摘要:即使'tomcat leak Detection'显示泄漏,如果保留的大小为0,它没有泄漏,它只是等待GC删除它。

    注意:在visualVM中触发GC并不总是将其删除。虽然它将被JVM本身触发的GC删除。

答案 1 :(得分:-4)

尝试从任务管理器进程关闭javaw.exe。