什么是Java堆中的“活动”对象? (带有jmap的堆转储)

时间:2019-04-03 13:30:45

标签: garbage-collection jvm heap-dump jmap

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的转储文件。

我对活动对象的猜测可能是:

  1. 年轻一代的对象;

  2. 已使用/引用/可访问且不会被收集的对象。

哪个是对的?

更新

我的猜测#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之后,堆中几乎所有对象都是活动的。

1 个答案:

答案 0 :(得分:2)

jmap -dump:live,file=live-dump.bin <pid>

以下jmap命令中的

live 选项强制JVM在将堆内容转储到文件中之前执行完整的GC。

完整的GC之后,只有从GC根可传递地到达的对象(定义为“活动”)保留在堆中。