我已经尝试使用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
$
我应该在哪里找到它?
我也在Windows系统遇到了相同的问题。
jcmd 6232 GC.heap_dump filename=IShp1.hprof
运行时显示文件已创建,但在 C 盘搜索未找到。重新运行后得到“文件已存在”。
尝试使用指定的路径和不同的文件名。
jcmd 6232 GC.heap_dump filename=c:\temp\IShp2.hprof
这也出现了“文件已存在”的错误。
我得出结论:'filename'没有被正确使用。 可能 jcmd 正在将某个内部指定的未知文件名写入某个未知位置,而当指定了“文件名”时,它不起作用。
相反,
jcmd 6232 GC.heap_dump c:\temp\isHpdmp1.hprof
工作并将文件写入指定位置。因此,对于*nix
系统,可能会像下面这样:
jcmd 6232 GC.heap_dump /opt/temp/myHd.hprof
jcmd 6232 GC.heap_dump heap.hprof
您将能够在由输出的目录中找到heap.hprof
lsof -p 6232 | grep cwd
从实际情况看,上游已经拒绝在4年内“修复”诊断问题:
https://bugs.openjdk.java.net/browse/JDK-8177763 - 通过 jcmd 获取 hprof dump 应进行更强的选项检查。
官方文档 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks004.html 提供了不正确的示例,例如:
Example 3-2 Create a Heap Dump using 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
find . -iname '*livetest-grindtohalt.hprof*'
也没有找到它。我假设它在当前目录下,因为这是运行jcmd命令和进程25156的代码库根目录。 - Robin Greenfind / ...
命令。 - arkantos