4

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

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

4

2 回答 2

11

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

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

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

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

于 2009-08-27T12:14:38.493 回答
0

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

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

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

这里

于 2009-08-21T19:57:55.857 回答