我正在使用旧的Java应用程序中的MAT(分析堆转储)调试OutOfMemory问题。 MAT显示RMI Thread创建了My Business Object(BO)的Array(BO [150K +]),它有150k +实例,消耗大约358 MB(Xmx是512 MB)。这是一个内存泄漏的情况。
我在所有转储中注意到的另一个有趣的部分(在服务器崩溃后创建),Array Object中的实例数量相同。
我无法理解如何找到这个Array对象,在这个类中创建了这个数组对象。 MAT中有没有这样的直接/间接特征?
请在visualVM或其他工具中提供任何此类选项。或者我可以在代码库上运行的一些内存分析器。
答案 0 :(得分:0)
如果您需要一个可以显示实例分配位置的分析器,您可以尝试JProfiler。堆walker有一个“Allocations”视图,您可以在其中查看任何对象集的累积调用堆栈。要获得分配调用堆栈,您必须在启动时打开分配记录。
免责声明:我公司开发JProfiler
答案 1 :(得分:0)
在vanilla jVisualVM中,您可以在堆转储上使用OQL。 OQL中的一个函数是heap.livepaths,它将实例作为参数并输出所有阻止垃圾收集的路径。
如果你有一个你不知道的具体类或对象(相关的窗口关闭了摆动和垃圾收集器被强制多次),你可以列出这些路径并获得几个参考路径的例子。
冲洗并重复,直到所有可疑物体都被垃圾收集。然后它变得更加困难,因为你不再有领先优势,但你可能在你的应用程序中发现了几个错误,并且可能已将其修复到可接受的程度。
注意:我通常会一直在分析内存泄漏,但它可能不适用于非常复杂的应用程序。
答案 2 :(得分:0)
在Eclipse MAT直方图中选择数组对象并右键单击并选择
"merge shortest path to GC Root" (exclude weak references) ,
这应该向您显示创建路径,直到创建此数组的基类对象。