为什么每个对象似乎都被标记为新对象,而不仅仅是第二个快照中的对象,而不是我的基线快照中的对象?在网上环顾四周,我看到一些建议我需要使用 hprof 而不是 jmap 来进行内存转储,但似乎 hprof 以完全相同的格式生成转储。
这是 JDK 1.6.0_14;我在 Windows 和 UNIX 上都试过了。
jhat -baseline
确实不适用于jmap
. 我不确定,但我相信这是因为 hprof 从一开始就附加到 JVM 并保持自己的对象跟踪,允许它在多个转储中生成一致的 ID。不要引用我的话。无论哪种方式,就您而言,重要的一点是 jmap 转储不起作用。
然而,一切都没有丢失。去获取Eclipse 内存分析器。(如果你不使用 Eclipse,不用担心,你可以将它作为一个独立的可执行文件来获取。)它比 jhat 更快,比 jhat 使用更少的内存,它可以做你想做的事情:
所有这些都适用于 jmap 转储。
看来您需要使用 hprof。但是你确定你使用的是同一个虚拟机实例吗?
-baseline 选项允许比较两个转储(如果它们是由 HPROF 生成的并且来自同一个 VM 实例)。如果同一对象出现在两个转储中,它将被排除在报告的新对象列表之外。一个转储被指定为基线,分析可以专注于自获得基线以来在第二个转储中创建的对象。
如果一切都被认为是新的,我将确保这是 VM 的同一个实例。