我们在linux中使用oracle jvm 1.8 64位。
我们知道jmap可以获得jvm堆转储:
jmap -F -dump:format=b,file=***filepath*** ***pid***
但速度很慢。
我们知道,使用JVisualVM和JConsole连接到JMX也可以获得堆转储,而且速度非常快。但它们是使用GUI的。
但是,在我们的产品环境中,没有GUI。任何安装了GUI的机器都无法访问该环境。
因此,我们的问题是- JVisualVM和JConsole能否支持命令行来执行堆转储?或者,除了jmap之外,还有没有命令行方法来获取jvm堆转储?
我们今天试过了-
1、使用jvisualvm(远程jmx),我们可以成功获得堆转储
2 .使用不带-F选项的jmap时,转储失败:
root@panda01 ~# jmap -dump:format=b,文件=/tmp/heapdump.31941.hprof 31941
31941:无法打开套接字文件:目标进程未响应或未加载HotSpot VM
当目标进程没有响应时,可以使用-F选项
3 .使用带有-F选项的jmap,转储成功,但速度很慢:
root@panda01 ~# jmap -F -dump:format=b,文件=/tmp/heapdump.31941.hprof 31941
正在附加到进程ID 31941,请稍候...
已成功附加调试器。
检测到服务器编译器。
JVM版本为25.92-b14
正在将堆转储到/tmp/heapdump.31941.hprof...
已创建堆转储文件
我们注意到了结果(2个.hprof文件)。使用jvisualvm的文件转储(称为第一转储)小于使用jmap -F的文件转储(称为第二转储)。使用jvisualvm查看,第一个转储中的实例数量和大小远远小于第二个转储中的实例数量和大小。
https://stackoverflow.com/questions/38219660
复制相似问题