我们在 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(remote jmx),我们可以成功获取heap dump
2、使用不带-F选项的jmap,转储失败:
[root@panda01 ~]# jmap -dump:format=b,file=/tmp/heapdump.31941.hprof 31941
31941:无法打开套接字文件:目标进程未响应或 HotSpot VM 未加载
当目标进程没有响应时可以使用 -F 选项
3、使用jmap带-F选项,转储成功,但速度慢:
[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查看,第一个dump中的实例数量和大小比第二个dump中的实例数量和大小要少得多。
最佳答案
关于java - 除了jmap之外,还有命令行方法来获取jvm堆转储吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38219660/