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 配置文件
当试图将代理 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 配置文件