什么是在我的程序中泄漏 int 数组?

What is leaking int arrays in my program?

我有一个 Java 程序,它在大约 16 小时内慢慢地用 GC 没有清除的整数数组填充堆。

我只有 VisualVM 可用于诊断问题,这就是我发现 int[] 正在填充堆的方式。

关于如何找到 int[] 创作来源的任何想法?

我刚开始使用分析器,所以也许我错过了那个功能,但我已经使用它的堆转储、快照和分析器来查看它,它告诉我的是 int[] 在高使用率。

  1. 使用JDK的工具jmap,使用命令提取内存转储,
jmap -dump:live,format=b,file=dumplive.hprof <PID>
  1. hprof 文件导入 Eclipse Memory Analyzer (MAT)

    NOTE Can be installed as a plugin in a Eclipse installation, but I don't recommend if the dump is too big.

使用分析器,您可以在捕获时查看有关内存使用情况的所有信息。

在 VisualVM 中,您可以找到对对象的引用。这应该可以让您了解程序的哪一部分正在泄漏那些 int 数组。

说明:

  1. 让你的程序运行久了,以至于堆上有很多泄露的int数组实例等着你去找。

  2. 在 VisualVM 中进行堆转储:主菜单 > 应用程序 > 堆转储。堆转储选项卡应打开。

  3. 在堆转储选项卡中,单击 Summary 字段并将其更改为 Objects。应打开堆对象类型列表。

  4. 展开 int[] 条目以查看实例列表。

  5. 展开其中一个实例。

  6. 展开 references 条目。

将打开一个引用该 int 数组实例的字段列表。此处的信息可能会给您一些线索。

对不同的实例重复步骤 5-6,直到找到泄漏的数组之一。

下图显示了我的 Eclipse 堆转储中对 int 数组的引用。

在此示例中,int 数组实例存储在某些内部 Eclipse OffsetTable class 的 valueTable 字段中,后者又被 RegistryObjectManager 使用。