【问题标题】:why there is difference in Heap dump size generated by jmap and jcmd?为什么 jmap 和 jcmd 生成的堆转储大小存在差异?
【发布时间】:2019-02-02 19:50:28
【问题描述】:

我正在尝试使用以下 2 个命令进行堆转储

  1. jcmd $pid GC.heap_dump /tmp/filename.dump
  2. jmap -dump:format=b,file=/tmp/filename.dump $pid

jcmd 产生的文件大小约为 300M,而 jmap 产生的文件大小约为 1.4G。为什么这些大小不同,我们在 jmap 中是否有任何其他信息?我在 jcmd 中缺少一些参数吗?

JDK 是 1.8.0_162

Xms 和 Xmx 是 4G

【问题讨论】:

  • 您是否尝试在没有格式参数的情况下运行 jmap,即 jmap -dump:file=... ?当 jmap 命令中缺少格式参数时,Oracle 建议 1. 和 2. 是等价的。
  • @jkonst 是的,这解决了我的问题。

标签: java java-8 heap-dump jmap jcmd


【解决方案1】:

默认情况下(未提供 [选项] 时],

JMAP 进行 all-objects 转储,而 JCMD 仅进行 live-objects 转储。

使用 JMAP 命令: 使用此命令时,您不需要指定任何内容,因为默认情况下会生成所有对象的堆转储。如果你只需要 live 对象,你可以在 JMAP 中传递 '-dump:live' 选项。

使用 JCMD 命令: 使用此命令时,您必须传递 -all 选项。否则,它将请求完整的 GC 并仅生成活动对象转储。

JCMD - 没有任何对象状态选项 - 默认情况下它只转储活动对象。

JMAP - 没有任何对象状态选项 - 默认情况下它会转储所有对象。

更多信息请参考here

【讨论】:

  • 今天有机会在分析另一个 OOM 时进行测试,你是对的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
相关资源
最近更新 更多