分析一个Java进程“不响应”?

时间:2018-12-21 04:05:13

标签: java jvm jstack jstat

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

1 个答案:

答案 0 :(得分:2)

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. 当前用户的
  5. 凭据(euid / egid)与附加套接字的所有者不匹配。确保由JVM的同一用户运行jstack。如果您由其他用户运行jstack,即使该用户是root,也无法执行附加操作。

  6. 目标进程的
  7. /tmp目录与您的Shell的/tmp不同。在以下情况下可能会发生这种情况:
    • JVM在另一个mount namespace中启动。通常,当JVM在Docker容器中运行时,会发生这种情况。从同一容器中运行jstack会有所帮助。
    • JVM在chroot环境中启动。例如,LXC容器可以使用chroot
      如何检查:运行readlink -f /proc/PID/root/tmp来查看它是否指向/tmp或其他目录。
  8. 目标JVM的当前工作目录属于不允许更改权限的文件系统。 CIFSDrvFs(WSL)是此类文件系统的示例。

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

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

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

  10. JVM进程已挂起。

    如何检查:运行ps PID。实时JVM进程的STAT列应为Sl

More about the internals of jstack.

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