首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是java堆中的“活动”对象?(使用jmap的堆转储)

什么是java堆中的“活动”对象?(使用jmap的堆转储)
EN

Stack Overflow用户
提问于 2019-04-03 13:30:44
回答 1查看 5.6K关注 0票数 6

jmap帮助显示:

..。

-dump:要将java堆转储为hprof二进制格式的转储选项:只有动态转储活动对象;如果没有指定,堆中的所有对象都会被转储。 ..。

一旦我转储了Tomcat (使用java param -Xmx384m)堆:

代码语言:javascript
运行
复制
jmap -dump:file=dump.bin <pid>

我有一个大约300米的转储文件。

当我仅使用活动对象转储它的堆时:

代码语言:javascript
运行
复制
jmap -dump:live,file=live-dump.bin <pid>

我有一个120米的转储文件。

我对活物体的猜测可能是:

  1. 年轻一代的对象;
  2. 对象,这些对象使用/引用/可访问且不会被收集。

哪一个是对的?

更新

我的猜测2似乎是正确的,感谢Alexey的解释(live选项将导致一个完整的GC)。根据他的提示,我再次测试了一下:

代码语言:javascript
运行
复制
jmap -dump:file=dump.hprof <pid>
jmap -dump:live,file=live-dump.hprof <pid>
jmap -dump:file=after-live-dump.hprof <pid>

这3个文件的大小如下:

代码语言:javascript
运行
复制
dump.hprof ~190MB
live-dump.hprof ~40MB
after-live-dump.hprof ~40MB

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-03 17:58:59

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

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

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55496429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档