首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jcmd创建的堆转储文件在哪里?

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

Stack Overflow用户
提问于 2019-10-23 09:27:25
回答 3查看 5.5K关注 0票数 5

我尝试使用jcmd (从git控制台窗口)获取堆转储:

代码语言:javascript
复制
$ /c/Program\ Files/Java/jdk1.8.0_202/bin/jcmd 25156 GC.heap_dump filename=livetest-grindtohalt.hprof
25156:
Heap dump file created

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

代码语言:javascript
复制
$ find -name livetest-grindtohalt.hprof

$

我在哪里可以找到它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-30 00:53:40

的回答将您设置为实际使用jcmd的正确路径。要回答原始帖子中的问题,相对路径将根据指定的java进程的当前工作目录进行解析。所以之后

代码语言:javascript
复制
jcmd 6232 GC.heap_dump heap.hprof

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

代码语言:javascript
复制
lsof -p 6232 | grep cwd
票数 8
EN

Stack Overflow用户

发布于 2019-12-11 21:27:10

我在窗户上也有同样的问题。

代码语言:javascript
复制
jcmd 6232 GC.heap_dump filename=IShp1.hprof

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

尝试使用文件名中指定的路径和不同的文件名,

代码语言:javascript
复制
jcmd 6232 GC.heap_dump filename=c:\temp\IShp2.hprof

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

我的结论是“文件名”没有得到尊重。当指定“文件名”时,jcmd大概是在将内部指定的未知文件名写入某个未知位置。

相反,

代码语言:javascript
复制
jcmd 6232 GC.heap_dump c:\temp\isHpdmp1.hprof

工作并将文件写入指定位置。所以对*nix来说大概是这样的

代码语言:javascript
复制
jcmd 6232 GC.heap_dump /opt/temp/myHd.hprof 
票数 17
EN

Stack Overflow用户

发布于 2020-12-21 22:33:53

实际上,上游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 GC.heap_dump filename=Myheapdump

filename=脱了。

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

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58519663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档