【问题标题】:permgen, but Java VisualVM says "No GC root found"permgen,但 Java VisualVM 说“没有找到 GC 根”
【发布时间】:2013-06-10 08:56:19
【问题描述】:

我有一个非常简单的“Hello world”类型的网络应用程序(Spring 3.2.1,Hibernate 4.1.9),用于停止/重新启动网络应用程序 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并选择“堆转储” 单击 [heapdump] 上的“OQL 控制台” 运行此查询:

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

找到 4 个实例:

org.apache.catalina.loader.WebappClassLoader

选择一个“开始”字段为“假”的 右键单击“this”引用并单击“Show Nearest GC Root” 显示“未找到 GC root”对话框。

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

【问题讨论】:

  • 这有什么更新吗?我正在努力解决这个问题。有什么要分享的吗?
  • @ggarciao,还没有喘息的机会。
  • 我在 Stackoverflow 线程上创建了我的案例 stackoverflow.com/questions/19470328/…
  • 如果您发现了什么,请随时分享一些知识,我也会这样做

标签: tomcat7 permgen jvisualvm


【解决方案1】:

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

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

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

但这是件好事

那些教程漏掉了一步,查看 WebappClassLoader 列表时,点击右侧的“Compute Retained Size”链接

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

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

这只是意味着它们已经为 JVM 运行的下一次 GC 运行做好了准备。

总结:虽然'tomcat泄漏检测'显示有泄漏,但如果retained size为0,则没有泄漏,只是在等待GC清除。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果 env. tomcat 是部署在 linux 上的吗?如果有其他应用程序部署到 t/c 怎么办?此外,关闭可能不是一种选择。
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多