处理问题 Java 堆转储

Issue Taking Java Heap Dump

我正在尝试进行 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)

所以我想我的问题是我做错了什么以及继续尝试获取此堆转储的最佳方法是什么?

要解决使用 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