2

AttachNotSupportedException在尝试开始 JFR 录制时收到。它工作正常,直到现在。

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)
4

3 回答 3

7

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

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

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

有关动态附加机制的描述,请参见此答案

于 2017-01-18T16:41:05.367 回答
1

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

于 2017-12-06T00:09:50.693 回答
1

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

于 2017-09-04T17:29:14.860 回答