我们在通过 jstack 命令查看 java 进程的栈信息时,会报错 Unable to open socket file: target process not responding or HotSpot VM not loaded,主要原因是当前执行命令用户的权限没有对 java 程序启动用户的执行权限。
解决方法
问题演示:
[demo@Linux ~]# jstack 23547
23547: 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 为当前的用户名。
问题的本质是当前执行 jstack 命令用户名和 java 程序启动的用户不一致,导致当前用户打不开如上的文件,我们可以通过 ps -ef | grep java
查看相应 java 程序的启动用户后,切换到对应用户后,再执行即可。