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

Java - AttachNotSupportedException: Unable to open socket file: HotSpot VM not loaded

当试图将代理 jar 文件附加到 java 中的另一个进程 运行 时,我遇到了异常:

com.sun.tools.attach.AttachNotSupportedException: 无法打开套接字文件:目标进程未响应或 HotSpot VM 未加载

我是 运行 linux,使用 java Oracle JDK 8_101,但是在回答这个问题之后问题 我已经意识到 O.S 与此问题的原因无关紧要。

编辑: 答案:

如果您遇到此问题,我遇到的原因是因为我从不同的 JVM 启动程序,而不是为系统指定的默认 JVM。

即)

程序 A (启动器),例如 JVM-1 (JDK_8_1 上的 运行,或 JDK_8_1/jdk/jre).

程序 A (启动器), 用 java -jar programB.jar[= 创建一个进程11=]

程序B(目标),在系统默认的JVM上是运行,例如JVM-2 (JDK_8_2 , 或 JDK_8_2/jre).

程序 A (启动器) 不能附加到 程序B(目标),因为JVMProgramA(The launcher) is 运行 on, does not match the JVM of which Program B(目标)是运行,因此抛出 com.sun.tools.attach.AttachNotSupportedException:

出现此问题的常见原因:

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

问题:不同用户执行jcmd

调用 jcmd 的用户可能与 运行 调用进程的用户不同。

示例:

  • 用户以 root 身份调用 jcmd
  • user 运行ning JVM as fancyUser

解决方案:

在 Linux 上尝试使用同一用户 运行 jcmd,因为进程是 运行ning。

当你遇到这种情况时,你会报错。

问题:AppArmor

当为限制系统调用的 运行ning JVM 实例启用 AppArmor 时,打开套接字连接可能会受到限制。

解决方案:

更改进程的 AppArmor 配置文件