除了jmap之外还有一个命令行方法来获取jvm堆转储吗?

我们在linux中使用oracle jvm 1.8 64bit。

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

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

但它很慢。

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

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

所以我们的问题是 – JVisualVM和JConsole是否支持命令行来进行堆转储? 或者除了jmap之外还有一个命令行方法来获取jvm堆转储吗?

我们今天试过 –

1,使用jvisualvm(远程jmx),我们可以成功获得堆转储

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 – 它会更快。

这个答案描述了不同之处。

请注意,如果没有-F jmap,则应在与目标进程相同的用户/组下运行。