我的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 version
jmap:jmap
jstat:jstat
jinfo:jinfo
任何人都可以帮助查看并共享一些有关解决此类Java“无响应”问题的链接吗?
答案 0 :(得分:2)
Unable to open socket file
问题的可能原因:
jinfo PID
可以正常工作。-XX:+DisableAttachMechanism
选项启动。jinfo PID
进行验证。附加插槽/tmp/.java_pidNNN
已被删除。
一种常见的做法是使用某些计划的脚本自动清除/tmp
。在这种情况下,您应该配置清除软件,使其不删除.java_pid*
文件。
如何检查:运行lsof -p PID | grep java_pid
如果它列出了一个套接字文件,但是该文件不存在,那么这正是所描述的问题。
凭据(euid
/ egid
)与附加套接字的所有者不匹配。确保由JVM的同一用户运行jstack
。如果您由其他用户运行jstack
,即使该用户是root
,也无法执行附加操作。
/tmp
目录与您的Shell的/tmp
不同。在以下情况下可能会发生这种情况:
jstack
会有所帮助。chroot
环境中启动。例如,LXC容器可以使用chroot
。readlink -f /proc/PID/root/tmp
来查看它是否指向/tmp
或其他目录。目标JVM的当前工作目录属于不允许更改权限的文件系统。 CIFS和DrvFs(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
。
More about the internals of jstack.
还有一个jattach
项目,它是jstack
/ jmap
的更好选择。它可以自动处理凭据问题,可以与Docker容器一起使用,支持chroot的JVM并处理不常见的文件系统。