【发布时间】:2018-01-05 20:06:49
【问题描述】:
我正在尝试使用 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)
所以我想我的问题是我做错了什么以及继续尝试获取此堆转储的最佳方法是什么?
【问题讨论】:
-
使用与运行 JVM 相同的用户帐户运行
jmap(不带 -F)怎么样? -
我收到一条错误消息,指出用户没有权限
-
什么权限?创建转储文件?尝试用户有权写入的其他目录。
-
尝试使用 jcmd 作为进程所有者,并写入同一用户拥有的目录我得到这个:权限被拒绝
标签: java memory-leaks jvm heap-dump