如何使用Java内存分析器在堆转储中识别对象引用持有者

6
由于我的应用程序出现了OutOfMemoryErrors,我希望找到根本原因。因此,我从AIX服务器上的IBM VM中创建了一个堆转储(PHD),并尝试使用IBM Support Assistant 4.1及其Memory Analyzer工具进行分析。
当堆转储被解析时,ISA会询问我是否要运行泄漏嫌疑报告。
使用泄漏嫌疑支持,我获得了一些占用大量内存的类的信息。
现在我想要确定对象引用的持有者,但是例如我只能看到ArrayList中包含哪些对象,而无法看到谁持有对该ArrayList的引用。
如何获取这些信息?
1个回答

8

在Memory Analyzer (MAT)中加载您的堆转储。

enter image description here 进入直方图并查看大型对象。

enter image description here 现在右键单击此对象,选择“Immediate dominators”。它将打开一个支配者树,您可以确定是什么持有了您的对象。

enter image description here

有时当大型对象是局部变量时,您将无法在树中看到直接支配者。它只能告诉您您的变量是哪个线程的一部分。(下面的图像不显示此局部变量场景)

enter image description here

在这种情况下,请检查(堆栈跟踪)您何时遇到OutOfMemoryError。然后相应地向后追踪并尝试找出您正在哪个方法中创建大型对象作为局部变量。在大多数情况下,我们在同一方法中获得大型对象,该方法在堆栈跟踪中显示为在某个时候分配更多内存时我们会收到OutOfMemoryError。

更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接