0

我的 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“无响应”问题的链接吗?

4

1 回答 1

3

问题的可能原因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) 的凭据与附加套接字的所有者不匹配。确保您jstack由与 JVM 相同的用户运行。如果您由其他用户运行,则附加将不起作用jstack,即使该用户是root.

  5. /tmp目标进程的目录与/tmp您的 shell 的目录不同。这可能发生在以下情况:
    • JVM 在不同的挂载命名空间中启动。这通常发生在 JVM 在 Docker 容器中运行时。jstack从同一个容器中运行会有所帮助。
    • JVM 在chroot环境中启动。例如,LXC 容器可能使用chroot.
      如何检查:运行readlink -f /proc/PID/root/tmp以查看它是否指向/tmp或指向其他目录。
  6. 目标JVM的当前工作目录属于不允许更改权限的文件系统。CIFSDrvFs (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 的内部结构。

还有jattach一个项目是jstack/的更好替代方案jmap。它可以自动处理凭证问题,它可以与 Docker 容器一起使用,支持 chroot'ed JVM 并处理不常见的文件系统。

于 2018-12-30T00:18:04.837 回答