9

我正在尝试使用以下 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

4

1 回答 1

12

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

JMAP 进行所有对象转储,而 JCMD 仅进行活动对象转储。

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

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

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

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

有关更多信息,请参阅此处

于 2019-07-30T09:01:09.710 回答