为什么 jmap 和 jcmd 生成的堆转储大小不同?
why there is difference in Heap dump size generated by jmap and jcmd?
我正在尝试使用以下 2 个命令进行堆转储
- jcmd $pid GC.heap_dump /tmp/filename.dump
- 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 进行了 all-objects 转储,而 JCMD 仅进行了 live-objects 转储。
使用 JMAP 命令:
使用此命令时,您无需指定任何内容,因为它默认生成所有对象的堆转储。如果您只需要活动对象,您可以在 JMAP 中传递 '-dump:live' 选项。
使用 JCMD 命令:
使用此命令时,您必须传递 -all 选项。否则,它将请求完整的 GC 并仅生成活动对象转储。
JCMD - 没有任何对象状态选项 - 默认情况下它只转储活动对象。
JMAP - 没有任何对象状态选项 - 默认情况下它会转储所有对象。
有关详细信息,请参阅 here
我正在尝试使用以下 2 个命令进行堆转储
- jcmd $pid GC.heap_dump /tmp/filename.dump
- 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 进行了 all-objects 转储,而 JCMD 仅进行了 live-objects 转储。
使用 JMAP 命令: 使用此命令时,您无需指定任何内容,因为它默认生成所有对象的堆转储。如果您只需要活动对象,您可以在 JMAP 中传递 '-dump:live' 选项。
使用 JCMD 命令: 使用此命令时,您必须传递 -all 选项。否则,它将请求完整的 GC 并仅生成活动对象转储。
JCMD - 没有任何对象状态选项 - 默认情况下它只转储活动对象。
JMAP - 没有任何对象状态选项 - 默认情况下它会转储所有对象。
有关详细信息,请参阅 here