gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:02:16 25 4
gpt4 key购买 nike

由于我在应用程序中遇到一些 OutOfMemoryErrors 问题,所以我想找出根本原因。这是我从 AIX 服务器上的 IBM VM 创建的堆转储 (PHD),并尝试使用 IBM Support assistant 4.1 及其内存分析器工具对其进行分析。

当堆转储被解析时,ISA 询问我是否要运行泄漏可疑报告。

使用泄漏方面的支持,我得到了一些消耗大量内存的类的信息。

我现在想要识别的是对象引用的持有者,但我可以,例如只能看到 ArrayList 包含哪些对象,但看不到谁拥有对该 ArrayList 的引用。

我怎样才能得到这些信息?

最佳答案

在内存分析器 (MAT) 中加载堆转储。

enter image description here转到直方图并查看大尺寸对象。

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

enter image description here

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

enter image description here

在那种情况下,检查(堆栈跟踪)你在哪里得到 OutOfMemoryError。然后相应地向后追踪它并尝试找出您使用哪种方法将大尺寸对象创建为局部变量。大多数情况下,我们使用与堆栈跟踪中显示的相同方法获得大尺寸对象,因为在某个时间点分配更多内存时我们得到 OutOfMemoryError。

More details.

关于java - 如何使用堆转储识别 Java 内存分析器中对象的引用持有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24888121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com