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.
...
当我转储一个带有Java参数-Xmx384m的Tomcat堆时:
jmap -dump:file=dump.bin <pid>
我得到了一个大约300兆的转储文件。
当我只使用活动的对象对其进行堆转储时:
jmap -dump:live,file=live-dump.bin <pid>
我得到了一个大约120M的dump文件。
我猜测活着的对象可能是:
1. 新生代中的对象; 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>
这三个文件的大小分别为:
dump.hprof ~190MB
live-dump.hprof ~40MB
after-live-dump.hprof ~40MB
所以,在使用 -dump:live
命令之后,堆中几乎所有的对象都是活动的。