【问题标题】:Java - AttachNotSupportedException: Unable to open socket file: HotSpot VM not loadedJava - AttachNotSupportedException:无法打开套接字文件:HotSpot VM 未加载
【发布时间】:2018-06-30 23:36:26
【问题描述】:

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

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

我使用 java Oracle JDK 8_101 运行 linux,但是在回答了这个问题之后,我意识到操作系统对于这个问题的原因并不重要。

编辑: 答案:

如果您遇到此问题,对我来说发生此问题的原因是因为我从不同的 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 (启动器) 不能强>依附于 Program B (The target),因为JVM Program A (启动器) 正在运行,与 的 JVM 不匹配程序 B (目标)正在运行,因此抛出 com.sun.tools.attach.AttachNotSupportedException:

【问题讨论】:

  • 您可能会增加附加超时(当它与超时有关而不是与权限有关时)-Dsun.tools.attach.attachTimeout=10000(默认为 5000)。你能发布一些代码来重现这个问题吗?

标签: java linux sockets jvm agent


【解决方案1】:

此问题的常见原因:

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

【讨论】:

  • 谢谢我的人!将检查任何调度程序以删除 tmp 文件夹。有没有办法指定文件的存储位置?
  • @JoeD 不幸的是,该位置在 JVM 中是硬编码的。但是,一个进程可以在它自己的mount namespace 中运行,因此JVM 进程的/tmp 将不同于其余系统的/tmp
【解决方案2】:

问题:不同的用户执行 jcmd

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

例子:

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

解决方案:

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

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

问题:AppArmor

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

解决办法:

为进程更改 AppArmor-Profile

【讨论】:

    猜你喜欢
    • 2014-10-15
    • 2013-09-11
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多