尝试开始 JFR 记录时出现 AttachNotSupportedException

AttachNotSupportedException when trying to start a JFR recording

我在尝试开始 JFR 录制时收到 AttachNotSupportedException。 一直正常,到现在。

jcmd 3658 JFR.start maxsize=100M filename=jfr_1.jfr dumponexit=true settings=profile

输出:

3658:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
        at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
        at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)

可能会发生什么?

SO: Oracle Linux 服务器版本 6.7

$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

可能的原因之一是 /tmp/.java_pid1234 文件已被删除(其中 1234 是 Java 进程的 PID)。

依赖动态附加机制的工具(jstack、jmap、jcmd、jinfo)通过在 /tmp 创建的 UNIX 域套接字与 JVM 通信。 如果指定了 -XX:+StartAttachListener 标志,则此套接字由 JVM 在第一次连接尝试时懒惰地创建,或者在 JVM 初始化时急切地创建。

一旦socket对应的文件被删除,工具就无法连接到目标进程,不幸的是,不重启JVM就无法re-create通信socket。

有关动态附加机制的说明,请参阅 this answer

结合个人经验...开发环境分区,操作系统所在分区与操作系统分区不同的场景也会出现此问题。例如,操作系统分区是 EXT4,开发环境分区是 NTFS(JVM 所在的位置)。出现问题是因为您无法创建文件“/tmp/.java_pid6024”(其中 6024 是 java 进程的 PID)。 要排除故障,请在 JVM 或应用程序服务器的启动处添加 -XX: + StartAttachListener。

另一种可能性:您的应用程序 运行 在 systemd 下 'PrivateTmp=yes'。这样可以防止找到 /tmp/.java_pid1234 文件。