1

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

似乎丢失的字段可能永远不会被分配,但那些丢失的字段的值是什么?它们是“零”值还是来自字段初始化程序的值?

编辑:

JVM是Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

编辑2:

似乎缺少的字段不是“零”(通过调试确认),但可能从未分配给。

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

4

2 回答 2

2

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


OQL 窗口

对于 OQL,除了那些具有空值的引用之外,所有引用都会显示。

对于具有 9 个属性的对象,myWorkspaceMap 为空


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

属性窗口

由于支配树的想法是让非循环图 MAT 确定 closeController 拥有 URLJarFile 对象并且不在主窗口中显示此属性。

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

考虑 URLJarFile 中的 name 属性:

名称未显示在支配树中

如果我们选择“List object -> with incoming references”,我们可以看到,这个 String 是从多个对象中引用的:

字符串被多个对象引用

于 2016-03-03T12:06:16.240 回答
0

问题是我正在查看的视图只应该列出对象引用,因此null不显示字段或原始值。

解决方案是添加“Inspector”视图或切换到专用的“Memory Analysis”透视图,这将显示每个选定实例的实际字段,如@Taky 的屏幕截图所示。

于 2016-03-03T13:11:11.230 回答