尝试开始 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 文件。
我在尝试开始 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 文件。