1

我正在尝试使用 Eclipse MAT 分析内存泄漏。我已经知道该问题是由本质上是链表的对象引起的,例如:

class Obj {
  byte[] data;
  Obj next;
}

问题是它非常深(大约 40,000 个元素),而且它也不是标准的LinkedList,所以这里没有 MATs 支持。

有了第一个元素,我试图到达列表的底部,但我找不到比简单地右键单击next和选择更好的东西了Go To,这在 40,000 个元素中需要很长时间。有没有办法使用某种脚本轻松到达链接堆栈的底部?

4

1 回答 1

2

有没有办法使用某种脚本轻松到达链接堆栈的底部?

您可以做的是使用jhatObject Query Language称为OOL(一种类似 SQL 的查询语言来查询堆转储)来对您的堆转储执行查询。

1.启动jhat

jhat <path-to-my-heap-dump-file>

这将默认在端口上启动一个 Web 服务器7000

2.进入OOL页面

  1. 转到http://localhost:7000/
  2. 点击Execute Object Query Language (OQL) queryOther Queries部分

3.执行我的查询

假设您要获取Obj其字段next为的实例,null则要启动的查询将是以下类型:

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

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

对于更复杂的查询,您可以参考http://localhost:7000/oqlhelp/提供的文档。


做同样事情的另一种方法是使用jvisualvmjhat.

  1. 开始jvisualvm
  2. File/Load...
  3. 选择您的堆转储文件然后单击Open,它将打开您的堆转储
  4. 然后点击OQL Console
  5. Query Editor's 部分中输入您的查询并单击Execute
  6. 然后,您的结果将出现在Query Results' 部分中,然后您将能够更深入地了解您选择的实例
于 2016-09-30T11:45:33.137 回答