java 堆中的 "live" 个对象是什么? (使用 jmap 进行堆转储)
what are "live" objects in java heap? (heap dump with 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 的转储文件。
我猜活个对象可能是:
对象在年轻代;
被使用/引用/可达但不会被收集的对象。
哪一个是正确的?
更新
我的猜测 #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 根("live" 的定义)可传递到达的对象保留在堆中。
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 的转储文件。
我猜活个对象可能是:
对象在年轻代;
被使用/引用/可达但不会被收集的对象。
哪一个是正确的?
更新
我的猜测 #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>
live 选项强制 JVM 在将堆内容转储到文件之前执行完整的 GC。
在完全 GC 之后,只有从 GC 根("live" 的定义)可传递到达的对象保留在堆中。