我的java进程停止响应。我尝试jstack,但失败了,出现以下错误。
21039: 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
然后我使用了-F选项,但是"没有发现死锁">
其他信息:
java版本:java版本
jmap:jmap
jstat:jstat
金佛:金佛
有人能帮忙看看并分享一些关于解决这种java"无响应"问题的链接吗?
Unable to open socket file
问题的可能原因:
- 目标PID不是HotSpot JVM进程
这显然不是你的情况,因为jinfo PID
运行良好 - JVM是用
-XX:+DisableAttachMechanism
选项启动的
这也可以通过jinfo PID
进行验证 -
附加套接字
/tmp/.java_pidNNN
已删除
有一种常见的做法是使用一些预定的脚本自动清理/tmp
。在这种情况下,您应该将清理软件配置为不删除.java_pid*
文件。如何检查:运行
lsof -p PID | grep java_pid
如果它列出了一个套接字文件,但该文件不存在,那么这正是所描述的问题。 -
当前用户的凭据(
euid
/egid
)与连接套接字的所有者不匹配。确保与JVM由同一用户运行jstack
。如果由其他用户运行jstack
,即使该用户是root
,Attach也不会起作用。 - 目标进程的
/tmp
目录与shell的/tmp
目录不同。这种情况可能发生在以下情况下:- JVM是在不同的装载命名空间中启动的。当JVM在Docker容器中运行时,通常会发生这种情况。在同一个容器中运行
jstack
会有所帮助 - JVM是在
chroot
环境中启动的。例如,LXC容器可以使用chroot
如何检查:运行readlink -f /proc/PID/root/tmp
查看它是否指向/tmp
或其他目录
- JVM是在不同的装载命名空间中启动的。当JVM在Docker容器中运行时,通常会发生这种情况。在同一个容器中运行
-
目标JVM的当前工作目录属于不允许更改权限的文件系统。CIFS和DrvF(WSL)就是这样的文件系统的示例。
如何检查:运行
umask 077; touch /proc/PID/cwd/somefile.tmp
,然后验证文件所有者是您自己,并且文件权限是600
。 -
JVM正忙,无法到达安全点。例如,JVM正处于长时间运行的垃圾回收过程中。
如何检查:运行
kill -3 PID
。JVM应该在控制台中打印线程转储和堆信息。如果JVM不转储任何内容,但进程消耗了几乎100%的CPU或显示出高I/O利用率,那么这看起来就像所描述的问题。 -
JVM进程已挂起。
如何检查:运行
ps PID
。活动JVM进程的STAT
列应该是Sl
。
有关jstack内部结构的更多信息。
还有CCD_ 27项目,它是CCD_ 28/jmap
更好的替代方案。它可以自动处理凭据问题,与Docker容器配合使用,支持chroot’ed JVM,并处理不常见的文件系统。