我正在尝试使用java堆转储来帮助调查内存泄漏。每当我使用它时:
jmap -J-d64 -dump:format=b,file=myheapdump -F 29498
堆转储文件达到大约16,048 kb并停止增长,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)
所以我想我的问题是我做错了什么,以及在尝试获得这个堆转储时最好的方法是什么?
答案 0 :(得分:0)
要在使用jcmd时解决错误,可以尝试添加此答案中提到的jvm参数: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
如果您使用Linux,另一种可能性是使用此处概述的gdb工具: https://www.atlassian.com/blog/archives/so-you-want-your-jvms-heap