Jvm 尝试开始JFR录制时,AttachNotSupportedException

Jvm 尝试开始JFR录制时,AttachNotSupportedException,jvm,jmc,jfr,Jvm,Jmc,Jfr,尝试开始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

尝试开始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)

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

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

一旦删除了与套接字对应的文件,工具就无法连接到目标进程,不幸的是,如果不重新启动JVM,就无法重新创建通信套接字


有关动态连接机制的说明,请参阅。

个人经验。。。在将开发环境划分为多个分区,并且操作系统所在的分区与操作系统分区不同的情况下,也会出现此问题。例如,操作系统分区是EXT4,开发环境分区是NTFS(JVM所在的位置)。出现问题的原因是无法创建文件“/tmp/.java_pid6024”(其中6024是java进程的PID)。
要对add-XX进行故障排除,请在JVM或应用程序服务器的开始处:+StartAttachListener。

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

请参阅。确保Java进程在同一用户下运行
jcmd
。确保
/tmp
目录是可写的。如果目标JVM挂起,
jcmd
也将不起作用。@apangin
jcmd
由同一个用户执行,/tmp是可写的,JVM没有挂起。Java进程是在chroot或cgroups下运行的吗?不。它不是在chroot或cgroups下运行的。进程ID可能错误,附加机制可能被禁用或其他。。。这将是一个猜测游戏,没有你方的更多分析。当我添加StartAttachListener时,jcmd没有返回。我只使用root用户在Windows7主机上VirtualBox的RHEL7中运行java进程和jcmd。正在按预期创建pid文件。甚至文件也按预期在/tmp/hsperfdata\u root/中创建。有什么问题吗?
$ 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)