分析Java进程"not responding"?



我的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问题的可能原因:

  1. 目标PID不是HotSpot JVM进程
    这显然不是你的情况,因为jinfo PID运行良好
  2. JVM是用-XX:+DisableAttachMechanism选项启动的
    这也可以通过jinfo PID进行验证
  3. 附加套接字/tmp/.java_pidNNN已删除
    有一种常见的做法是使用一些预定的脚本自动清理/tmp。在这种情况下,您应该将清理软件配置为不删除.java_pid*文件。

    如何检查:运行lsof -p PID | grep java_pid
    如果它列出了一个套接字文件,但该文件不存在,那么这正是所描述的问题。

  4. 当前用户的凭据(euid/egid)与连接套接字的所有者不匹配。确保与JVM由同一用户运行jstack。如果由其他用户运行jstack,即使该用户是root,Attach也不会起作用。

  5. 目标进程的/tmp目录与shell的/tmp目录不同。这种情况可能发生在以下情况下:
    • JVM是在不同的装载命名空间中启动的。当JVM在Docker容器中运行时,通常会发生这种情况。在同一个容器中运行jstack会有所帮助
    • JVM是在chroot环境中启动的。例如,LXC容器可以使用chroot
      如何检查:运行readlink -f /proc/PID/root/tmp查看它是否指向/tmp或其他目录
  6. 目标JVM的当前工作目录属于不允许更改权限的文件系统。CIFS和DrvF(WSL)就是这样的文件系统的示例。

    如何检查:运行umask 077; touch /proc/PID/cwd/somefile.tmp,然后验证文件所有者是您自己,并且文件权限是600

  7. JVM正忙,无法到达安全点。例如,JVM正处于长时间运行的垃圾回收过程中。

    如何检查:运行kill -3 PID。JVM应该在控制台中打印线程转储和堆信息。如果JVM不转储任何内容,但进程消耗了几乎100%的CPU或显示出高I/O利用率,那么这看起来就像所描述的问题。

  8. JVM进程已挂起。

    如何检查:运行ps PID。活动JVM进程的STAT列应该是Sl

有关jstack内部结构的更多信息。

还有CCD_ 27项目,它是CCD_ 28/jmap更好的替代方案。它可以自动处理凭据问题,与Docker容器配合使用,支持chroot’ed JVM,并处理不常见的文件系统。

相关内容

  • 没有找到相关文章

最新更新