1

我的 java 应用程序中有一些内存泄漏。我已经使用 jmap 进行了 2 个堆转储。我看到有 200 个对象长大了,我想这是内存泄漏的原因。但我需要验证它是完全相同的对象。我使用 MAT 和 visualvm 进行转储分析。那么,有什么方法可以验证来自不同堆转储的 2 个对象是同一个对象吗?我的意思是可能有某种方法可以获取这些对象的哈希码。我试图通过对象 id 进行搜索,但后来我了解到它是内存中对象的地址,所以对我来说没用。

4

1 回答 1

0

我知道这个问题很老,但我最终在这里试图通过谷歌找到答案。我发现 OQL 在 VisualVM 中比在 MAT 中更易于使用,因此我最终得到了我在 VisualVM 中寻找的对象,并希望查看在 MAT 中引用它的内容。所以我需要能够在 VisualVM 中获取对象哈希码。当您在 MAT 中拥有哈希码时,您可以直接访问您想要查看的对象。

在此处输入图像描述

在Instances视图中找到所需的对象后,右键单击它并执行Copy ID。这将为您提供哈希码。然后,您可以将其带到 MAT 并找到引用它的所有内容、它引用的所有内容等。

在此处输入图像描述

因此,要回答您的问题,您可以比较哈希码,如果两个对象具有相同的哈希码,则它们是相同的对象。哈希码是内存中创建对象的位置。它可以由垃圾收集器移动,如果它是长期存在的,等等。但是为了你的目的,如果两个对象现在在同一个位置,那么它们是同一个对象并且具有相同的哈希码。

于 2021-08-27T13:27:52.317 回答