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

时间:2018-01-22 10:52:55

标签: java linux sockets jvm agent

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

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

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

编辑: 答案:

如果遇到这个问题,我之所以遇到这个问题,是因为我是从一个不同的JVM启动一个程序,而不是为系统指定的默认JVM。

即)

计划 (启动器) ,正在 JVM-1 (例如JDK_8_1,或JDK_8_1 / jdk / jre)

计划 A (启动器) ,使用<创建一个流程strong> java -jar programB.jar

程序 B (目标) ,正在系统上运行& #39;默认JVM, JVM-2 (例如JDK_8_2,或JDK_8_2 / jre)

计划 A (启动器) 不能计划 B (目标) ,因为JVM 计划< / strong> (启动器) 正在运行,与的JVM不匹配程序 B (目标) 正在运行,因此抛出 com.sun.tools.attach.AttachNotSupportedException:

2 个答案:

答案 0 :(得分:3)

此问题的常见原因:

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

答案 1 :(得分:2)

问题:执行jcmd的其他用户

可能发生的情况是,调用jcmd的用户与运行该过程的用户不同。

示例:

  • 用户以root用户身份调用jcmd
  • 以fancyUser身份运行JVM的用户

解决方案:

在Linux上,请尝试以同一用户运行jcmd,因为该进程正在运行。

在这种情况下,您将得到错误提示。

问题:AppArmor

当启用了AppArmor来运行JVM实例(这会限制sys-calls)时,可能是打开套接字连接受到限制的情况。

解决方案:

更改AppArmor配置文件以进行处理