java - 如何在 Eclipse MAT 中分析深层链接的对象

标签 java memory-leaks heap-dump eclipse-mat

我正在尝试使用 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页面

  1. 转到http://localhost:7000/
  2. 点击其他查询部分中的执行对象查询语言 (OQL) 查询

3。执行我的查询

假设您想要获取字段 nextnullObj 实例,则要启动的查询将为以下类型:

select o from my.package.Obj o where o.next == null

然后,您将找到类 my.package.Obj 其字段 nextnull 的所有实例。只需单击您选择的实例即可获取有关它们的更深入的信息。

对于更复杂的查询,您可以引用 http://localhost:7000/oqlhelp/ 中提供的文档.

<小时/>

做同样事情的另一种方法是使用 jvisualvm它比 jhat 更加用户友好,但也消耗更多内存。

  1. 启动jvisualvm
  2. 转到文件/加载...
  3. 选择您的堆转储文件,然后单击打开,它将打开您的堆转储
  4. 然后点击OQL Console
  5. 查询编辑器部分中输入您的查询,然后单击执行
  6. 您的结果将显示在查询结果部分,然后您将能够更深入地了解您选择的实例

关于java - 如何在 Eclipse MAT 中分析深层链接的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39790098/

相关文章:

ios - 仪器报告的内存泄漏。不明白为什么

javascript - $.cache 什么时候被认为太大了?

android - 为什么我要用 HPROF 查看器和分析器查找 "Duplicate Strings"?

java - 除了jmap之外,还有命令行方法来获取jvm堆转储吗?

java - Hibernate 没有使用 query.list() 获得正确的记录;

java - 如何在 logback 中滚动应用程序关闭时的日志文件?

java - 如何在 Yalantis Ucrop 中提供 Assets URI

java - 无法解析所有 androidx 库

Java内存泄漏与字符串?为什么这会消耗和崩溃

java - 扫描仪程序 OutOfMemoryError 和使用内存分析器 (MAT