Unable to open socket file: target process not responding or HotSpot VM not loaded异常解决-爱代码爱编程
今天报警发现一个服务器内存过大,经排查发现是java应用导致。
通过jps获取到java进程的pid(ps,top都可以)
[root@api00 ~]# jps
21765 Jps
19493 api.jar
想使用jcmd和jstack分析下进程状态,没想到执行报错了
[root@api00 ~]# jcmd 19493 GC.class_histogram
19493:
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)
[root@api00 ~]# jstack 19493
11161: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
检查发现java应用是由特定用户robot启动的,不是root启动的,jstack需要使用与进程一致的用户才能执行,通过ps可以看到启动项目的用户。
第一列就是启动用户
[root@api00 ~]# ps -ef |grep java
robot 19493 1 99 13:39 ? 01:14:49 java -jar api.jar
root 22352 19925 0 14:21 pts/0 00:00:00 grep --color=auto java
解决
切换到robot用户,再robot用户下执行
[root@api00 ~]# su - robot
Last login: Wed Apr 14 14:23:55 CST 2021 on pts/0
[robot@api00 ~]$ jstack 19493
2021-04-14 14:24:49
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):
"Attach Listener" #406 daemon prio=9 os_prio=0 tid=0x00007fd138003000 nid=0x57ff waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"AsyncResolver-bootstrap-executor-0" #405 daemon prio=5 os_prio=0 tid=0x00007fd0f001e000 nid=0x4fec waiting on condition [0x00007fd005196000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000682a6c4a8> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
命令正常执行
再使用jcmd和jstack时,要注意需要使用和java进程一致的用户才能执行