![](/img/trans.png)
[英]why there is difference in Heap dump size generated by jmap and jcmd?
[英]Where is the heap dump file created by 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
$
我在哪里可以找到它?
我在 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
Douglas Kretzmann 的回答讓您走上了實際使用 jcmd 的正確道路。 為了回答原始帖子中的問題,相對路徑是針對指定 java 進程的當前工作目錄解析的。 所以之后
jcmd 6232 GC.heap_dump heap.hprof
您將能夠在目錄 output 中找到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.ZFC35FDC70D5FC69D2569883A82E不正確的例子,例如:C
示例 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.