Java - AttachNotSupportedException: 无法打开套接字文件:HotSpot VM未加载

3
尝试将一个代理jar文件附加到在Java中运行的另一个进程时,我遇到了以下异常:
com.sun.tools.attach.AttachNotSupportedException: 无法打开套接字文件:目标进程未响应或HotSpot VM未加载。
我正在运行Linux,并使用Oracle JDK 8_101,但在回答这个问题之后,我意识到操作系统并不影响此问题的原因。
如果您遇到此问题,它发生的原因可能是因为我从与系统默认JVM不同的JVM启动程序。
即)
程序A(启动器)正在JVM-1上运行(例如JDK_8_1或JDK_8_1/jdk/jre)。
程序A(启动器)使用java -jar programB.jar创建一个进程。
程序B(目标)正在运行系统的默认JVM,JVM-2(例如JDK_8_2或JDK_8_2/jre)。
程序A(启动器)无法连接到程序B(目标),因为程序A(启动器)运行的JVM与程序B(目标)正在运行的JVM不匹配,从而抛出com.sun.tools.attach.AttachNotSupportedException异常。

您可以增加附加超时时间(当它与超时有关而不是与权限有关)-Dsun.tools.attach.attachTimeout=10000 (默认值为5000)。您能否发布一些代码以重现此问题? - SubOptimal
重复了一个伟大的 https://dev59.com/GF8e5IYBdhLWcg3wEG_A。 - gavenkoa
2个回答

10

出现这个问题的常见原因:

  • 附加的socket /tmp/.java_pid1234 已被删除(例如,由一个定期清理/tmp的作业所执行)。
  • 目标JVM是使用-XX:+DisableAttachMechanism选项启动的。
  • 正在进行垃圾回收或其他长时间的VM操作(例如堆转储)。
  • JVM无法在附加超时内到达安全点。这种情况很少发生,通常是间歇性的问题。

谢谢,我的朋友!我将查看有关 tmp 文件夹删除的任何调度程序。是否有办法指定文件存储的位置? - Joe
1
@JoeD 很遗憾,位置信息在JVM内部是硬编码的。然而,可以在其自己的安装命名空间中运行一个进程,这样JVM进程的/tmp将与系统的/tmp不同。 - apangin
对我来说,这是由于缺少/tmp/.java_pidXXX文件导致的(发生在HotSpot版本1.8.0_281和RHEL 8.3操作系统上)。 但另一次是由于使用另一个用户启动jcmd/jmap命令,如https://dev59.com/FF8e5IYBdhLWcg3wucVT#51507597答案中所解释的。 - Mariano Paniga

4

问题: 不同用户执行 jcmd

可能会出现,调用 jcmd 的用户不同于运行该进程的用户。

示例:

  • 以 root 用户调用 jcmd
  • 以 fancyUser 用户运行 JVM

解决方案:

在Linux上尝试使用与进程相同的用户运行 jcmd。

当您遇到这种情况时,会出现给定的错误。

问题: AppArmor

当为运行的JVM实例启用了AppArmor(限制系统调用),可能会导致打开套接字连接受限。

解决方案:

更改进程的AppArmor配置文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接