jcmd 创建的堆转储文件在哪里?
Where is the heap dump file created by jcmd?
我尝试使用 jcmd 进行堆转储(来自 git bash 控制台 window):
$ /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盘没找到。
Re运行 得到了'file exists'。
尝试使用文件名中指定的路径和不同的文件名,
jcmd 6232 GC.heap_dump filename=c:\temp\IShp2.hprof
这也得到了'file exists'.
我断定 'filename' 没有受到尊重。
当指定 'filename' 时,大概 jcmd 正在将一些内部指定的未知文件名写入某个未知位置。
而是
jcmd 6232 GC.heap_dump c:\temp\isHpdmp1.hprof
工作并将文件写入指定位置。
所以大概 *nix
类似
jcmd 6232 GC.heap_dump /opt/temp/myHd.hprof
Douglas Kretzmann 的回答让您走上了实际使用 jcmd 的正确道路。要回答原始 post 中的问题,相对路径是根据指定 java 进程的当前工作目录解析的。所以
之后
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 转储可以受益于更强大的选项检查。
官方文档: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
我尝试使用 jcmd 进行堆转储(来自 git bash 控制台 window):
$ /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盘没找到。 Re运行 得到了'file exists'。
尝试使用文件名中指定的路径和不同的文件名,
jcmd 6232 GC.heap_dump filename=c:\temp\IShp2.hprof
这也得到了'file exists'.
我断定 'filename' 没有受到尊重。 当指定 'filename' 时,大概 jcmd 正在将一些内部指定的未知文件名写入某个未知位置。
而是
jcmd 6232 GC.heap_dump c:\temp\isHpdmp1.hprof
工作并将文件写入指定位置。
所以大概 *nix
类似
jcmd 6232 GC.heap_dump /opt/temp/myHd.hprof
Douglas Kretzmann 的回答让您走上了实际使用 jcmd 的正确道路。要回答原始 post 中的问题,相对路径是根据指定 java 进程的当前工作目录解析的。所以
之后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 转储可以受益于更强大的选项检查。
官方文档: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