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

标签 java memory memory-leaks out-of-memory

由于我在应用程序中遇到一些 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/

相关文章:

php - php内存中数组的大小

java - 在达到最大堆空间之前出现 OutOfMemoryError?

c - gtk_file_chooser_get_filename,结果未释放,内存泄漏?

memory-leaks - Jetty 8 服务器上的内存泄漏

c - 使用 Windows 解决 GTK+/Queue 中的内存泄漏问题

java - 打开文件时颜色更改不起作用

java - 如何使用java检查mysql中的特定数据库是否已经存在

java - selenium webdriver xpath InvalidSelectorError

GC 报告可用内存时 Android OutOfMemory?

java - 代理困惑的优雅解决方案