除了 jmap 之外,是否有命令行方法来获取 jvm 堆转储?

Is there a command line method to get a jvm heap dump besides jmap?

我们在 linux.

中使用 oracle jvm 1.8 64 位

我们知道 jmap 可以获取 jvm 堆转储:

jmap -F -dump:format=b,file=***filepath*** ***pid***

但是速度很慢。

我们知道连接到 JMX 的 JVisualVM 和 JConsole 也可以获得堆转储,而且速度非常快。但是它们带有 GUI。

但是,在我们的产品环境中,没有GUI。没有带有 GUI 的机器可以访问该环境。

所以我们的问题是 - JVisualVM 和 JConsole 是否支持命令行进行堆转储? 要么 除了 jmap 之外,是否有命令行方法来获取 jvm 堆转储?

我们今天试过了 -

1、使用jvisualvm(remote jmx),我们可以成功获取heap dump

2、使用不带-F选项的jmap,转储失败:

[root@panda01 ~]# jmap -dump:format=b,file=/tmp/heapdump.31941.hprof 31941

31941: 无法打开套接字文件:目标进程没有响应或 HotSpot VM 没有加载

当目标进程没有响应时可以使用-F选项

3、使用带-F选项的jmap,转储成功,但速度较慢:

[root@panda01 ~]# jmap -F -dump:format=b,file=/tmp/heapdump.31941.hprof 31941

正在附加到进程 ID 31941,请稍候...

调试器附加成功。

检测到服务器编译器。

JVM 版本为 25.92-b14

正在将堆转储到 /tmp/heapdump。31941.hprof ...

已创建堆转储文件

我们注意到结果(2 个 .hprof 文件)。使用 jvisualvm 的文件转储(称为第一次转储)小于使用 jmap -F 的文件转储(称为第二次转储)。 用jvisualvm查看,第一个转储中的实例数量和大小比第二个转储中的要少很多。

使用不带 -F 选项的 jmap - 这样会更快。

区别在this answer中描述。

请注意,如果没有 -F,jmap 应该 运行 在与目标进程相同的 user/group 下。