【问题标题】:Why doesn't the -baseline option of jhat work?为什么 jhat 的 -baseline 选项不起作用?
【发布时间】:2009-08-14 18:17:19
【问题描述】:

为什么每个对象都被标记为新对象,而不仅仅是第二个快照中的对象,而不是我的基线快照中的对象?在网上环顾四周,我看到一些建议我需要使用 hprof 而不是 jmap 来进行内存转储,但似乎 hprof 生成的转储格式完全相同。

这是 JDK 1.6.0_14;我在 Windows 和 UNIX 上都试过了。

【问题讨论】:

  • 你能详细说明平台的版本(Windows?Unix?)和jdk吗?

标签: java profiling hprof jhat


【解决方案1】:

jhat -baseline 确实不适用于jmap 生成的转储。我不确定,但我相信这是因为 hprof 从一开始就附加到 JVM 并保持自己的对象跟踪,允许它在多个转储中生成一致的 ID。不要引用我的话。无论哪种方式,就您而言,重要的一点是 jmap 转储不起作用。

但是,一切都没有丢失。去获取Eclipse Memory Analyzer。 (如果你不使用 Eclipse,不用担心,你可以将它作为一个独立的可执行文件来获取。)它比 jhat 更快,比 jhat 使用更少的内存并且它可以做你想做的事情:

  1. 打开转储2(使用文件|打开堆转储)。不要费心让它为您创建报告。
  2. 打开转储1(相同方式)。同样,没有报告。
  3. 在 dump2 选项卡中,单击“直方图”
  4. 直方图子选项卡中工具栏的右侧是“与另一个堆转储比较”。点击它。
  5. 从对话框中选择 dump1 作为要用作基线的转储。
  6. Presto,你有 dump2 和基线 dump1 之间的差异。

所有这些都适用于 jmap 转储。

【讨论】:

  • 太棒了!有没有办法从那里深入到转储 2 中新的特定对象并找出它们持有的东西?
  • 据我所知,不是直接从比较,没有。不过,您可以从整个集合中向下钻取。 (选择 Dominator Tree,过滤到您感兴趣的类,右键单击,选择 List objects with incoming references,根据需要展开树。)我同意能够查看特定新对象的保留内容是有用,但我不知道该怎么做。
【解决方案2】:

看来您需要使用 hprof。但是你确定你使用的是同一个虚拟机实例吗?

-baseline 选项允许比较两个转储,如果它们是由 HPROF 生成的并且来自同一个 VM 实例。如果同一对象出现在两个转储中,它将被排除在报告的新对象列表之外。一个转储被指定为基线,分析可以专注于自获得基线以来在第二个转储中创建的对象。

如果一切都被认为是新的,我会确保这是 VM 的同一个实例。

Here

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2018-09-07
    • 2015-02-18
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2012-01-08
    • 2016-10-08
    相关资源
    最近更新 更多