为什么每个对象看起来都标记为new,而不仅仅是第二个快照中但不在我的基线快照中的对象?在线查看,我看到一些建议,我需要使用hprof而不是jmap来进行内存转储,但看起来hprof以完全相同的格式生成转储。
这是JDK 1.6.0_14;我试过Windows和UNIX。
答案 0 :(得分:10)
jhat -baseline
确实无法使用jmap
生成的转储。我不确定,但我相信这是因为hprof从一开始就连接到JVM并保持自己的对象跟踪,允许它在多个转储中生成一致的ID。不要引用我的话。无论哪种方式,就你所关注的重要一点而言,jmap转储不起作用。
然而,一切都不会丢失。去拿Eclipse Memory Analyzer。 (如果你不使用Eclipse,不要害怕,你可以把它作为一个独立的可执行文件。)它比jhat更快,使用的内存少于jhat 和它可以做你想要的:
所有这些都适用于jmap转储。
答案 1 :(得分:0)
似乎你需要使用hprof。但是您确定使用相同的VM实例吗?
-baseline选项允许比较两个转储,如果它们是由HPROF和同一个VM实例生成的。如果同一对象出现在两个转储中,它将从报告的新对象列表中排除。将一个转储指定为基线,分析可以关注自获取基线以来在第二个转储中创建的对象。
如果所有内容都被视为新内容,我将确保它与VM的实例相同。