我正在尝试使用 Eclipse MAT 分析内存泄漏。我已经知道该问题是由本质上是链表的对象引起的,例如像这样的东西:
class Obj {
byte[] data;
Obj next;
}
问题在于它非常深(大约 40,000 个元素),而且它也不是标准的 LinkedList
,因此此处不提供 MAT 支持。
有了第一个元素,我试图到达列表的底部,但我找不到比简单地右键单击 next
并选择 Go To
更好的方法了。 code>,如果有 40,000 个元素,则需要很长时间。有没有办法使用某种脚本来轻松到达链接堆栈的底部?
最佳答案
Is there a way to use some kind of scripting to get to the bottom of the linked stack easily?
你可以做的是使用 jhat
依靠对象查询语言
(也称为OOL
)(一种类似于 SQL 的查询语言来查询堆转储)来对堆转储执行查询。
1。启动jhat
jhat <path-to-my-heap-dump-file>
这将默认在端口 7000
上启动 Web 服务器
2。前往OOL
页面
- 转到http://localhost:7000/
- 点击
其他查询
部分中的执行对象查询语言 (OQL) 查询
3。执行我的查询
假设您想要获取字段 next
为 null
的 Obj
实例,则要启动的查询将为以下类型:
select o from my.package.Obj o where o.next == null
然后,您将找到类 my.package.Obj
其字段 next
为 null
的所有实例。只需单击您选择的实例即可获取有关它们的更深入的信息。
对于更复杂的查询,您可以引用 http://localhost:7000/oqlhelp/ 中提供的文档.
<小时/>做同样事情的另一种方法是使用 jvisualvm
它比 jhat
更加用户友好,但也消耗更多内存。
- 启动
jvisualvm
- 转到
文件/加载...
- 选择您的堆转储文件,然后单击
打开
,它将打开您的堆转储 - 然后点击
OQL Console
- 在
查询编辑器
部分中输入您的查询,然后单击执行
- 您的结果将显示在
查询结果
部分,然后您将能够更深入地了解您选择的实例
关于java - 如何在 Eclipse MAT 中分析深层链接的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39790098/