由于我在应用程序中出现OutOfMemoryErrors问题,因此我想找出根本原因。我从AIX服务器上的IBM VM创建了一个堆转储(PHD),并尝试使用IBM Support Assistant 4.1及其内存分析器工具对其进行分析。
解析堆转储后,ISA询问我是否要运行泄漏可疑报告。
使用泄漏方面的支持,我得到了一些类的信息,这些类消耗了大量的内存。
我现在要标识的是对象引用的持有者,但是例如,我只能看到ArrayList包含哪些对象,而不能看到谁持有对该ArrayList的引用。
我如何获得该信息?
在Memory Analyzer(MAT)中加载堆转储。
转到直方图,然后查看大尺寸的对象。
现在,右键单击此按钮,然后选择“即时控制者”。它将打开一个统治者树,您可以识别什么在握住您的对象。
有时,当大尺寸对象是局部变量时,您将无法在树中看到直接的支配者。它只能告诉您变量是哪个线程的一部分。(下图没有显示此局部变量的情况)
在这种情况下,请检查(堆栈跟踪)在哪里获取OutOfMemoryError。然后,将其向后追溯,并尝试找出使用哪种方法将大对象创建为局部变量。在大多数情况下,我们使用相同的方法来获取大型对象,这在某个时间点显示在堆栈跟踪中,同时分配更多的内存时,我们会得到OutOfMemoryError。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句