获取Java堆转储的问题

获取Java堆转储的问题,java,memory-leaks,jvm,heap-dump,Java,Memory Leaks,Jvm,Heap Dump,我正在尝试使用java堆转储来帮助调查内存泄漏。每当我使用这个: jmap -J-d64 -dump:format=b,file=myheapdump -F 29498 堆转储文件达到16048KB并停止增长,jmap将永远运行,除非我杀死它,否则不会停止。或者,我尝试使用以下方法: jcmd 29498 -F GC.heap_dump heapdump.hprof 但是,由于我是从root用户执行它的,并且该进程是从另一个用户运行的,因此我得到以下结果: com.sun.tools.at

我正在尝试使用java堆转储来帮助调查内存泄漏。每当我使用这个:

 jmap -J-d64 -dump:format=b,file=myheapdump -F 29498
堆转储文件达到16048KB并停止增长,jmap将永远运行,除非我杀死它,否则不会停止。或者,我尝试使用以下方法:

jcmd 29498 -F GC.heap_dump heapdump.hprof
但是,由于我是从root用户执行它的,并且该进程是从另一个用户运行的,因此我得到以下结果:

com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
    at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
    at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)
    at sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:147)
    at sun.tools.jcmd.JCmd.main(JCmd.java:131)
com.sun.tools.attach.AttachNotSupportedException:无法打开套接字文件:目标进程未响应或热点VM未加载
在sun.tools.attach.LinuxVirtualMachine。(LinuxVirtualMachine.java:106)
位于sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
位于com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)
位于sun.tools.jcmd.jcmd.executeCommandForPid(jcmd.java:147)
位于sun.tools.jcmd.jcmd.main(jcmd.java:131)

因此,我想我的问题是,我做错了什么?在尝试获取此堆转储时,向前推进的最佳方式是什么?

要避免使用jcmd时出现的错误,可以尝试添加此答案中提到的jvm参数:

如果您使用Linux,另一种可能性是使用gdb工具,如下所述:

从运行JVM时使用的同一用户帐户运行
jmap
(不带-F)怎么样?我收到一个错误,说明用户没有权限什么权限?要创建转储文件?尝试用户具有写入权限的其他目录。尝试将jcmd用作进程所有者,写入同一用户所拥有的目录时,我得到以下结果:权限被拒绝添加该参数会导致另一个错误:jcmd 17272-XX:+startatachlistener GC.heap\u dump heapdump.hprof 17272:java.lang.IllegalArgumentException:未知诊断command@jymbo从该错误消息看,您可能已将参数添加到jcmd命令本身?当您启动该进程时,需要将arg添加到您试图获取其转储的进程的java命令中