Jmap无法连接进行转储

Jas*_*oor 54 java heap jvm

我们有一个应用程序的公开测试版,偶尔会导致堆空间溢出.JVM通过永久度假来做出反应.

为了分析这一点,我想在失败的时候窥视记忆.Java不希望我这样做.该过程仍在内存中,但它似乎不被认为是一个java进程.

有问题的服务器是debian Lenny服务器,Java 6u14

/opt/jdk/bin# ./jmap -F -dump:format=b,file=/tmp/apidump.hprof 11175
Attaching to process ID 11175, please wait...
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypeEntryTypeNameOffset" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)
at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:390)
at sun.jvm.hotspot.HotSpotTypeDataBase.getLongValueFromProcess(HotSpotTypeDataBase.java:371)
at sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:102)
at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:85)
at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:568)
at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:494)
at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:332)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.tools.jmap.JMap.runTool(JMap.java:179)
at sun.tools.jmap.JMap.main(JMap.java:110)
Debugger attached successfully.
sun.jvm.hotspot.tools.HeapDumper requires a java VM process/core!
Run Code Online (Sandbox Code Playgroud)

Jas*_*oor 85

解决方案非常简单.我以root身份运行jmap,但是我必须以启动jvm的用户身份运行它.我现在会羞愧地隐藏自己的头脑.

  • 或者,Sun可以使错误不那么神秘,而不是说"需要一个java VM进程/核心!" (11认同)
  • 你好,你用什么命令来解决这个问题?我正在尝试使用`su -m myuser -c'jmap -J-d64 -dump:format = b,file =/tmp/apidump.hprof 98233'`,但我得到的是"不允许操作"作为响应. (4认同)

小智 34

我正在运行jmap和具有相同用户的应用程序,但仍然得到错误.

解决方案是在jmap之前执行的

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Run Code Online (Sandbox Code Playgroud)

比只使用jmap并且可以正常工作

jmap -heap 17210
Run Code Online (Sandbox Code Playgroud)

  • 记录[这里](http://www.thecodingmachine.com/fixing-java-memory-leaks-in-ubuntu-11-04-using-jmap/):"错误不明显,但来自配置在Ubuntu的ptrace." 此命令重新配置.记录为[JDK-7050524](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7050524) (2认同)

Ari*_*l T 17

未来的Google员工:

如果您在尝试jmap的进程正在运行时安装了JDK ,也会发生这种情况.

如果是这种情况,请重新启动java进程.

  • 如果由于要在当前状态下调查系统而无法重新启动java进程,该怎么办?这就是我现在的情况:(.我正是这样做的,我在进程运行时安装了JDK. (2认同)

Ole*_*ndr 15

如果有人试图在Docker容器中获取Heap Dump of Java应用程序.这是唯一对我有用的解决方案:

docker exec <container-name> jcmd 1 GC.heap_dump /tmp/docker.hprof
Run Code Online (Sandbox Code Playgroud)

它基本上使用jcmd转储pid = 1的进程堆

请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

  • 当在 Docker 中运行的 `java` 进程以非 root 用户身份运行时,这对我不起作用。以“root”身份运行时,出现“无法打开套接字文件:目标进程未响应或未加载 HotSpot VM”,以非 root 用户身份运行时,出现“权限被拒绝”。 (2认同)

bwa*_*wok 6

如果你跑的话会发生什么

./jmap -heap 11175 
Run Code Online (Sandbox Code Playgroud)

您确定应用程序JVM与JMAP JVM完全相同吗?(同版本等)

  • 在我的情况下:`/ opt/jvm/jdk1.7.0_15/bin/jmap -heap 2022附加到进程ID 2022,请稍候...附加到进程的错误:sun.jvm.hotspot.debugger.DebuggerException:不能附加到过程` (2认同)

Arb*_*lam 5

请按照以下步骤从Docker容器中获取线程和堆转储

  1. 运行以下命令将其扑向容器中。请适当更改CONTAINER_NAME
   docker exec -it CONTAINER_NAME bash
Run Code Online (Sandbox Code Playgroud)
  1. 然后键入jps以查找所有Java应用程序详细信息,并为您的应用程序提取PID
jps
Run Code Online (Sandbox Code Playgroud)
  1. 然后运行以下命令以获取线程转储。请适当更改PID

    jstack PID > threadDump.tdump 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后运行以下命令以获取堆转储。请适当更改PID

    jmap -dump:live,format=b,file=heapDump.hprof PID 
Run Code Online (Sandbox Code Playgroud)
  1. 然后从Docker容器退出并通过运行以下命令从Docker容器下载threadDump.tdump和heapDump.hprof。请适当更改CONTAINER_NAME
 sudo docker cp CONTAINER_NAME:threadDump.tdump .
 sudo docker cp CONTAINER_NAME:heapDump.hprof .
Run Code Online (Sandbox Code Playgroud)