簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM