什么是在我的程序中泄漏 int 数组?
What is leaking int arrays in my program?
我有一个 Java 程序,它在大约 16 小时内慢慢地用 GC 没有清除的整数数组填充堆。
我只有 VisualVM 可用于诊断问题,这就是我发现 int[]
正在填充堆的方式。
关于如何找到 int[]
创作来源的任何想法?
我刚开始使用分析器,所以也许我错过了那个功能,但我已经使用它的堆转储、快照和分析器来查看它,它告诉我的是 int[]
在高使用率。
- 使用JDK的工具
jmap
,使用命令提取内存转储,
jmap -dump:live,format=b,file=dumplive.hprof <PID>
- 将
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 数组。
说明:
让你的程序运行久了,以至于堆上有很多泄露的int数组实例等着你去找。
在 VisualVM 中进行堆转储:主菜单 > 应用程序 > 堆转储。堆转储选项卡应打开。
在堆转储选项卡中,单击 Summary 字段并将其更改为 Objects。应打开堆对象类型列表。
展开 int[]
条目以查看实例列表。
展开其中一个实例。
展开 references 条目。
将打开一个引用该 int 数组实例的字段列表。此处的信息可能会给您一些线索。
对不同的实例重复步骤 5-6,直到找到泄漏的数组之一。
下图显示了我的 Eclipse 堆转储中对 int 数组的引用。
在此示例中,int 数组实例存储在某些内部 Eclipse OffsetTable
class 的 valueTable
字段中,后者又被 RegistryObjectManager
使用。
我有一个 Java 程序,它在大约 16 小时内慢慢地用 GC 没有清除的整数数组填充堆。
我只有 VisualVM 可用于诊断问题,这就是我发现 int[]
正在填充堆的方式。
关于如何找到 int[]
创作来源的任何想法?
我刚开始使用分析器,所以也许我错过了那个功能,但我已经使用它的堆转储、快照和分析器来查看它,它告诉我的是 int[]
在高使用率。
- 使用JDK的工具
jmap
,使用命令提取内存转储,
jmap -dump:live,format=b,file=dumplive.hprof <PID>
- 将
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 数组。
说明:
让你的程序运行久了,以至于堆上有很多泄露的int数组实例等着你去找。
在 VisualVM 中进行堆转储:主菜单 > 应用程序 > 堆转储。堆转储选项卡应打开。
在堆转储选项卡中,单击 Summary 字段并将其更改为 Objects。应打开堆对象类型列表。
展开
int[]
条目以查看实例列表。展开其中一个实例。
展开 references 条目。
将打开一个引用该 int 数组实例的字段列表。此处的信息可能会给您一些线索。
对不同的实例重复步骤 5-6,直到找到泄漏的数组之一。
下图显示了我的 Eclipse 堆转储中对 int 数组的引用。
在此示例中,int 数组实例存储在某些内部 Eclipse OffsetTable
class 的 valueTable
字段中,后者又被 RegistryObjectManager
使用。