我们在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查看,第一个转储中的实例计数和大小远小于第二个转储中的实例数和大小。