jcmd创建的堆转储文件在哪里?

时间:2019-10-23 09:27:25

标签: java hprof jcmd

我尝试使用jcmd进行堆转储(从git bash控制台窗口中进行):

$ /c/Program\ Files/Java/jdk1.8.0_202/bin/jcmd 25156 GC.heap_dump filename=livetest-grindtohalt.hprof
25156:
Heap dump file created

但是,该文件似乎不存在:

$ find -name livetest-grindtohalt.hprof

$

在哪里可以找到它?

3 个答案:

答案 0 :(得分:3)

从字面上看,上游拒绝“修复”诊断长达 4 年:

https://bugs.openjdk.java.net/browse/JDK-8177763 - 通过 jcmd 获取 hprof 转储可以从更强大的选项检查中受益。

官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks004.html 提供了不正确的示例,例如:

<块引用>

示例 3-2 使用 jcmd 创建堆转储

jcmd <process id/main class> GC.heap_dump filename=Myheapdump

只需去除 filename=

转储的当前工作目录属于 PID 进程,而不是 jcmd!因此,如果您不想搜索转储,请使用完整路径 )) 完整工作流程:

mkdir dest/
chmod a+w dest/

sudo jcmd
1234 my.evil.app

sudo -u myuser -g mygrp jcmd 1234 GC.heap_dump $PWD/dest/myapp.hprof

答案 1 :(得分:2)

道格拉斯·克雷茨曼(Douglas Kretzmann)的答案为您提供了实际使用jcmd的正确方法。为了回答原始帖子中的问题,相对路径将针对指定的Java进程的当前工作目录进行解析。所以之后

jcmd 6232 GC.heap_dump heap.hprof

您将能够在输出的目录中找到heap.hprof

lsof -p 6232 | grep cwd

答案 2 :(得分:1)

我在Windows中遇到了同样的问题。

jcmd 6232 GC.heap_dump filename=IShp1.hprof

它运行了,说文件创建了,但是搜索c驱动器找不到它。 重新运行并得到“文件存在”。

尝试使用在文件名中指定的路径和另一个文件名

jcmd 6232 GC.heap_dump filename=c:\temp\IShp2.hprof

这也得到了“文件存在”。

我得出结论,“文件名”不被接受。 如果指定了“文件名”,则jcmd可能会将一些内部指定的未知文件名写入某个未知位置。

相反

jcmd 6232 GC.heap_dump c:\temp\isHpdmp1.hprof

工作并将文件写入指定的位置。 因此大概是*nix之类的

jcmd 6232 GC.heap_dump /opt/temp/myHd.hprof