我正在使用 Eclipse Memory Analyzer 查看 HPROF 文件。它为同一类的不同实例显示不同数量的字段:
看起来缺失的字段可能从未被分配过,但是这些缺失字段的值是多少?它们是“零”值还是来自字段初始值设定项的值?
编辑:
JVM 是 Java HotSpot(TM) 64 位服务器 VM(版本 25.40-b25,混合模式)
编辑2:
看起来缺失的字段不是“零”(通过调试确认),但可能从未分配过。
下面的 OQL 查询显示 Eclipse Memory Analyzer 实际上知道这些字段中的真实值,但只是选择不显示它们...
最佳答案
根据HProf format documentation对象的所有字段都存储在转储中,因此 MAT可以知道对象所有字段的值。
<小时/>OQL窗口
对于 OQL,将显示除具有空值的引用之外的所有引用。
<小时/>支配树窗口 对我来说,MAT 在支配树窗口中显示对象的所有属性。
自 idea of the dominator tree是让非循环图 MAT 确定 closeController 拥有 URLJarFile 对象,并且不在主窗口中显示此属性。
此外,这意味着,如果有多个对特定对象的强引用,并且无法识别该对象的所有者,则该对象将不会显示在支配树中。
考虑 URLJarFile 中的 name 属性:
如果我们选择“列表对象 -> 带有传入引用”,我们可以看到,该字符串被多个对象引用:
关于Java HPROF 堆转储缺少字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35768924/