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

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

最佳答案

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

然而,并没有失去一切。去拿 Eclipse Memory Analyzer 。 (如果您不使用 Eclipse,请不要担心,您可以将其作为独立的可执行文件使用。)它比 jhat 更快,比 jhat 使用更少的内存,并且可以执行您想要的操作:

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

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

    关于java - 为什么 jhat 的 -baseline 选项不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1279346/

    10-09 03:08