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

kma*_*oor 7 permgen jvisualvm tomcat7

关于停止/重启web-app Tomcat 7.0.26,我有一个非常简单的'Hello world'类型的Web应用程序(Spring 3.2.1,Hibernate 4.1.9)

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
Run Code Online (Sandbox Code Playgroud)

我采取了以下步骤:启动JVisualVM右键单击Tomcat并选择"堆转储"单击[heapdump]上的"OQL控制台"然后执行此查询:

select x from org.apache.catalina.loader.WebappClassLoader x
Run Code Online (Sandbox Code Playgroud)

找到4个实例:

org.apache.catalina.loader.WebappClassLoader
Run Code Online (Sandbox Code Playgroud)

选中的"已启动"字段为"false"右键单击"this"引用并单击"Show Nearest GC Root"将显示"未找到GC根"的对话框.

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

mut*_*nUp 5

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

  1. 使用VisualVM,
  2. 搜索WebappClassLoader,
  3. 寻找'started'等于false的那些.
  4. 点击'显示最近的GC根'

当它返回'No GC Root'时可能会令人困惑.

但这是件好事

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

visualVM显示计算保留大小的链接

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

visualVM显示保留的大小

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

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

简介:即使'tomcat leak Detection'显示泄漏,如果保留的大小为0,它没有泄漏,它只是等待GC去除它.

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


小智 -4

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