【发布时间】:2019-04-03 13:30:44
【问题描述】:
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 参数 -Xmx384m)堆:
jmap -dump:file=dump.bin <pid>
我有一个 ~300M 的转储文件。
当我只用 live 对象转储它的堆时:
jmap -dump:live,file=live-dump.bin <pid>
我有一个 ~120M 的转储文件。
我对 live 对象的猜测可能是:
年轻代中的对象;
已使用/引用/可访问且不会被收集的对象。
哪个是对的?
更新
我的猜测 #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 之后,堆中的几乎所有对象都是活动的。
【问题讨论】:
-
@Holger 对不起我糟糕的英语。 #2 我的意思是不再使用/引用但尚未收集的对象。
-
对不起我的愚蠢错误:-p
标签: garbage-collection jvm heap-dump jmap