我jvisualvm
用来检查我的应用程序中的内存泄漏。当我进行堆转储时,有时会有几个对象保持打开状态,这些对象应该被垃圾收集。
当我对它们执行“显示最近的 GC 根”命令时,它显示根是我定义的实现接口 Runnable 的类。引用列为(java frame)
,我知道这与线程有关。当我展开该节点的树时,它会打开并显示<no references>
. 所以很明显这不是我保持开放的参考,而是Java内部的东西。
jvisualvm 中列出的 GC Root 对象的类型AnalyticNode extends Node
为Node implements Runnable
. 这个根对象与 AWT、Swing 或任何重量级用户界面组件没有任何关系,尽管使用了“框架”这个词。在这种情况下,“框架”一词指的是线程。
那么 Java 是否保留了对最后一个 Runnable 的引用,该引用会保持这个打开状态?有什么方法可以告诉 Java 释放这个引用,以便可以为我的堆转储正确收集垃圾?
这里发生了什么?