jmap帮助显示:
...
-dump:<dump-options> to dump java heap in hprof binary format dump-options: live dump only live objects; if not specified, all objects in the heap are dumped.
...
一旦我转储Tomcat(使用java param -Xmx384m)堆:
jmap -dump:file=dump.bin <pid>
我有一个~300M的转储文件。
当我仅使用活动对象转储其堆时:
jmap -dump:live,file=live-dump.bin <pid>
我有一个~120M的转储文件。
我对活动对象的猜测可能是:
哪一个是对的?
UPDATE
我的猜测#2似乎是正确的,感谢Alexey Ragozin的解释(live
选项将导致完整的GC)。我根据他的暗示再次测试:
jmap -dump:file=dump.hprof <pid>
jmap -dump:live,file=live-dump.hprof <pid>
jmap -dump:file=after-live-dump.hprof <pid>
这3个文件的大小是:
dump.hprof ~190MB
live-dump.hprof ~40MB
after-live-dump.hprof ~40MB
所以在-dump:live
之后,几乎堆中的所有对象都是活的。
jmap -dump:live,file=live-dump.bin <pid>
下面的jmap命令中的live选项强制JVM在将堆内容转储到文件之前执行完整的GC。
在完全GC之后,只有从GC根可以传递的对象(“实时”的定义)保留在堆中。