Java HPROF 堆转储缺少字段?

标签 java heap-dump hprof

我正在使用 Eclipse Memory Analyzer 查看 HPROF 文件。它为同一类的不同实例显示不同数量的字段:

看起来缺失的字段可能从未被分配过,但是这些缺失字段的值是多少?它们是“零”值还是来自字段初始值设定项的值?

编辑:

JVM 是 Java HotSpot(TM) 64 位服务器 VM(版本 25.40-b25,混合模式)

编辑2:

看起来缺失的字段不是“零”(通过调试确认),但可能从未分配过。

下面的 OQL 查询显示 Eclipse Memory Analyzer 实际上知道这些字段中的真实值,但只是选择不显示它们...

最佳答案

根据HProf format documentation对象的所有字段都存储在转储中,因此 MAT可以知道对象所有字段的值。

<小时/>

OQL窗口

对于 OQL,将显示除具有空值的引用之外的所有引用。

myWorkspaceMap is null for the object with 9 attributes

<小时/>

支配树窗口 对我来说,MAT 在支配树窗口中显示对象的所有属性。

Attributes window

idea of the dominator tree是让非循环图 MAT 确定 closeController 拥有 URLJarFile 对象,并且不在主窗口中显示此属性。

此外,这意味着,如果有多个对特定对象的强引用,并且无法识别该对象的所有者,则该对象将不会显示在支配树中。

考虑 URLJarFile 中的 name 属性:

Name is not shown in the dominator tree

如果我们选择“列表对象 -> 带有传入引用”,我们可以看到,该字符串被多个对象引用:

String is referenced from several objects

关于Java HPROF 堆转储缺少字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35768924/

相关文章:

java - 为什么私有(private)变量即使被调用不止一次也只增加一次

java - RegEx 特殊字符 "|"在 Java 中转义

java - Jruby 堆转储失败

java - println 的 void 方法与带 return 方法的 println

java - 如何在Java中将两个整数打包成4位short?

java - 当我将 int 替换为 Short 时,为什么 Java 对象的大小相差超过两个字节?

java - 内存分析器工具 : ParseHeapDump. sh - 应用程序错误 : OutOfMemory Requested length of new long[2, 147,483,640] 超出限制 2,147,483,639

java - 为什么 hprof 文件的大小会比分配给 jvm 的内存量小得多

android - Android Studio 中具有高内存分配的堆转储永远不会完成

java - 是否可以从堆转储中的 hprof 转储/线程查看线程