【问题标题】:Issue Taking Java Heap Dump采用 Java 堆转储的问题
【发布时间】: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


【解决方案1】:

要绕过使用 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

【讨论】:

  • 添加该参数会产生另一个错误:jcmd 17272 -XX:+StartAttachListener GC.heap_dump heapdump.hprof 17272: java.lang.IllegalArgumentException: Unknown diagnostic command
  • @jymbo 从该错误消息看来,您可能已将参数添加到 jcmd 命令本身?当您启动该进程时,需要将 arg 添加到您尝试获取转储的进程的 java 命令中
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 2011-06-07
  • 1970-01-01
  • 2013-03-25
  • 2012-09-25
  • 2011-10-09
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多