【问题标题】:Java HPROF heap dump missing fields?Java HPROF 堆转储缺少字段?
【发布时间】:2016-03-03 10:02:54
【问题描述】:

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

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

编辑:

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

编辑 2:

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

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

【问题讨论】:

  • 你在说哪个fields?在这里,我看到所有条目都有 2 个字段
  • @AswinMurugesh 截图中只有两个实例。一个列出了 2 个字段,另一个列出了 9 个字段!!

标签: java heap-dump hprof


【解决方案1】:

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


OQL 窗口

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


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

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

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

考虑 URLJarFile 中的 name 属性:

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

【讨论】:

  • 从技术上讲,这与支配功能无关,因为我的屏幕截图清楚地表明我使用的是传出引用而不是传入引用。显然,应该可以确定地知道给定对象引用了哪些对象。
  • 但是你的截图让我找到了正确的方向。
  • 但我想你在 EDIT 2 之前使用的是支配树。对于 OQL,我已经放了截图来解释你的情况。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2017-11-19
    相关资源
    最近更新 更多