为什么jhat的-baseline选项不起作用?

时间:2009-08-14 18:17:20

标签: java profiling hprof jhat

为什么每个对象看起来都标记为new,而不仅仅是第二个快照中但不在我的基线快照中的对象?在线查看,我看到一些建议,我需要使用hprof而不是jmap来进行内存转储,但看起来hprof以完全相同的格式生成转储。

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

2 个答案:

答案 0 :(得分:10)

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

然而,一切都不会丢失。去拿Eclipse Memory Analyzer。 (如果你不使用Eclipse,不要害怕,你可以把它作为一个独立的可执行文件。)它比jhat更快,使用的内存少于jhat 它可以做你想要的:

  1. 打开dump2(使用File | Open Heap Dump)。不要为它创建报告而烦恼。
  2. 打开dump1(同样的方式)。再一次,没有报道。
  3. 在dump2的标签中,点击“直方图”
  4. 直方图子选项卡中工具栏的右侧是“与另一个堆转储比较”。点击它。
  5. 从对话框中选择dump1作为转储以用作基线。
  6. Presto,你有dump2和基线dump1之间的区别。
  7. 所有这些都适用于jmap转储。

答案 1 :(得分:0)

似乎你需要使用hprof。但是您确定使用相同的VM实例吗?

  

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

如果所有内容都被视为新内容,我将确保它与VM的实例相同。

Here