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