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

标签 java jvm heap-dump

我们在 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中的实例数量和大小要少得多。

最佳答案

使用不带-F选项的jmap - 它会更快。

this answer 中描述了差异.

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

关于java - 除了jmap之外,还有命令行方法来获取jvm堆转储吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38219660/

相关文章:

java - Camel 线程池查询

java - JVM 何时将成员变量引用存储在堆栈上?

java - 使用包含多个 Web 应用程序的 VisualVM 分析堆转储

java - 具有以固定速率运行的可运行对象的 Java 项目可以在一段时间后停止吗?我的在大约 40 小时后仍然卡住

java - JAVA 中的小部件

java - 由于推荐的 Jar 中缺少工件,无法从 Java 启动简单的 Pentaho 作业

Java 在发生 OutOfMemoryError 错误之前清空缓存

java - 在java中从文件夹ID和父ID创建文件夹

java - java服务器在OutOfMemoryError之后还能生存吗

java - 如何使用 ArrayList 来管理多个 JButton?