【发布时间】:2011-10-27 18:04:39
【问题描述】:
我正在使用jvisualvm 检查我的应用程序中的内存泄漏。当我进行堆转储时,有时会有几个本应被垃圾回收的对象保持打开状态。
当我对它们执行“显示最近的 GC 根”命令时,它显示根是我定义的实现接口 Runnable 的类。引用被列为(java frame),我知道这与线程有关。当我展开该节点的树时,它会打开并显示<no references>。所以很明显,这不是我保持开放的参考,而是 Java 内部的东西。
jvisualvm 中列出的 GC Root 对象的类型是 AnalyticNode extends Node,而后者又是 Node implements Runnable。这个根对象与 AWT、Swing 或任何重量级的用户界面组件没有任何关系,尽管使用了“框架”这个词。在这种情况下,“框架”一词是指线程。
那么,Java 是否会在某个地方保留对最后一个 Runnable 的引用以保持它处于打开状态?有什么方法可以告诉 Java 释放这个引用,以便正确地为我的堆转储收集垃圾?
这是怎么回事?
【问题讨论】:
-
在“Instances”面板中,您可以选择您认为应该收集的实例,右键单击,然后从上下文菜单中选择“Show in Threads”吗?如果有,它说明了什么?
标签: java memory-leaks garbage-collection jvisualvm