permgen,但 Java VisualVM 说“未找到 GC root”

2024-02-27

我有一个非常简单的“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

我采取了以下步骤: 启动 VisualVM 右键单击 Tomcat 并选择“堆转储” 单击 [堆转储] 上的“OQL 控制台” 运行此查询:

select x from org.apache.catalina.loader.WebappClassLoader x

找到 4 个实例:

org.apache.catalina.loader.WebappClassLoader

选择“开始”字段为“假”的一个 右键单击“this”引用,然后单击“显示最近的 GC Root” 将显示一个对话框,显示“未找到 GC 根”。

我缺少什么?任何帮助将不胜感激。 谢谢。


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

  1. 使用VisualVM,
  2. 搜索WebappClassLoader,
  3. 寻找 'started' 等于 false 的。
  4. 单击“显示最近的 GC 根”

当它返回“No GC Root”时,可能会令人困惑。

但这是一件好事

这些教程错过了一个步骤,当查看 WebappClassLoader 列表时,单击右侧的“计算保留大小”链接

过了一会儿(取决于堆的总大小),这将显示如下内容

Retained 值为 0 的行是also状态为 false 并且没有 GC Root 的 ClassLoader。

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

Summary:即使“tomcat泄漏检测”显​​示泄漏,但如果保留大小为0,则没有泄漏,只是等待GC将其删除。

注意:在 VisualVM 中触发 GC 并不总是会删除它。虽然它会被JVM本身触发的GC移除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

permgen,但 Java VisualVM 说“未找到 GC root” 的相关文章

随机推荐