除了 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 下。
我们在 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 下。