【问题标题】:what are "live" objects in java heap? (heap dump with jmap)java堆中的“活动”对象是什么? (使用 jmap 进行堆转储)
【发布时间】: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 对象的猜测可能是:

  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>

这三个文件的大小是:

dump.hprof ~190MB
live-dump.hprof ~40MB
after-live-dump.hprof ~40MB

所以在-dump:live 之后,堆中的几乎所有对象都是活动的。

【问题讨论】:

  • @Holger 对不起我糟糕的英语。 #2 我的意思是不再使用/引用但尚未收集的对象。
  • 对不起我的愚蠢错误:-p

标签: garbage-collection jvm heap-dump jmap


【解决方案1】:

jmap -dump:live,file=live-dump.bin &lt;pid&gt;

下面的 jmap 命令中的

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2011-08-28
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多