Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

java jstack jmap 等工具命令报错 Unable to open socket file: target process not responding or HotSpot VM not loaded

Java 命令行工具 Java 命令行工具


使用 java jstack jmap 等命令工具查看 java 进程信息时,会报错 Unable to open socket file: target process not responding or HotSpot VM not loaded,原因是当前执行命令用户的权限没有对 java 程序启动用户的执行权限。

问题演示:

[demo@Linux ~]# jstack 1
1: 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

解决方法

显示的错误中文意思是 “当前不能打开 socket file,导致不能获取目标进程的回复”。

java 程序启动后,默认(请注意是默认)会在 /tmp/hsperfdata_{user_name} 目录下以该进程的 id 为文件名新建文件,并在该文件中存储 jvm 运行的相关信息,其中的 user_name 为当前的用户名

[root@java-xxxx-server-775d9485b-66p44 ~]# ls -ltrh /tmp
total 20K
-rw------- 1 root root    0 Nov 13  2020 yum.log
drwxr-xr-x 2 root root 4.0K Aug 20 11:27 hsperfdata_root

上述示例可以看到 tmp 目录下存在 hsperfdata_root 目录,这表示是 root 账号创建的 java 进程,进入该目录会发现存在 java 进程 pid 命名的文件,该文件存放 java 进程运行相关信息,如下:

[root@java-xxxx-server-775d9485b-66p44 hsperfdata_root]# ls -ltrh
total 32K
-rw------- 1 root root 32K Aug 20 20:30 1

问题的本质是当前执行 java 工具命令的用户名和 java 程序启动的用户不一致,导致当前用户打不开如上的文件,我们可以通过 ps -ef | grep java 查看相应 java 程序的启动用户后,切换到对应用户后,再执行即可。