当我在jvisualvm中转储堆时,如何删除对Runnable的“Java Frame”GC根引用?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了当我在jvisualvm中转储堆时,如何删除对Runnable的“Java Frame”GC根引用?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1258字,纯文字阅读大概需要2分钟。
内容图文
我正在使用jvisualvm来检查我的应用程序中的内存泄漏.当我进行堆转储时,有时会有几个对象被打开,应该是垃圾回收.
当我对它们执行“显示最近的GC根”命令时,它向我显示根是我定义的类,它实现了Runnable接口.引用列为(java框架),我知道它与线程有关.当我展开此节点的树时,它会打开并显示< no references>.所以很明显,这不是我保持开放的参考,而是Java内部的东西.
jvisualvm中列出的GC Root对象的类型为AnalyticNode extends Node,而Node又实现了Runnable.尽管使用了“frame”一词,但这个根对象绝不与AWT,Swing或任何重量级用户界面组件有任何关系.在这种情况下,单词“frame”指的是线程.
那么Java是否会保留对最后一个Runnable的引用?有什么方法可以告诉Java发布这个引用,以便它可以正确地为我的堆转储垃圾收集?
这里发生了什么?
解决方法:
在此上下文中,“帧”指的是堆栈帧.听起来这个Runnable,而不是(或除了)是正在运行的线程的目标,存储在执行线程的堆栈中的帧中的局部变量中.当与框架关联的方法返回时,它将有资格进行收集.
根据后续评论,我的猜测是在您的自定义线程池中,有一个分配了Runnable的局部变量.它可能在一个范围太大(在循环之外)并且在循环的每次迭代之后没有被清除(指定为null).
我可以在工作线程中重现与此类代码相似的情况:
Runnable target = null;
while (true) {
target = queue.take();
target.run();
}
清理目标声明以使其在循环内部可以解决问题.
我建议从核心Java切换到Executor实现,或者如果要修复它,则发布自定义线程池的相关代码.
内容总结
以上是互联网集市为您收集整理的当我在jvisualvm中转储堆时,如何删除对Runnable的“Java Frame”GC根引用?全部内容,希望文章能够帮你解决当我在jvisualvm中转储堆时,如何删除对Runnable的“Java Frame”GC根引用?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。