com.sun.tools.attach.AttachNotSupportedException:无法打开套接字文件:目标进程无响应或 HotSpot VM 未加载
- 2024-11-14 08:30:00
- admin 原创
- 17
问题描述:
我在 Linux(ubuntu 64 位)上运行 jmockit 测试时遇到此AttachNotSupportedException
问题。Java 版本为 1.7.0_51。此 JDK 来自 Oracle。测试使用 ant 运行(可能不相关)
查看堆栈跟踪。
[junit]
[junit] java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89)
[junit] at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
[junit] at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
[junit] at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:136)
[junit] at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:169)
[junit] at junit.framework.TestResult.<clinit>(TestResult.java:15)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:356)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1165)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1016)
[junit] Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:79)
[junit] ... 8 more
[junit] Exception in thread "main" java.lang.ExceptionInInitializerError
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:356)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1165)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1016)
[junit] Caused by: java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89)
[junit] at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
[junit] at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
[junit] at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:136)
[junit] at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:169)
[junit] at junit.framework.TestResult.<clinit>(TestResult.java:15)
[junit] ... 3 more
[junit] Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:79)
[junit] ... 8 more
[junit] Running chs.caf.cap
它似乎与在 IBM JRE 上运行 jMockit 测试时出现的 AttachNotSupportedException有关。但这是在 IBM jre 上。
解决方案 1:
当我尝试使用转储线程时,我遇到了同样的问题jcmd
。即使我在用户jcmd
下运行,我也收到了相同的错误消息root
。
您需要jcmd <pid> Thread.print
在 下运行same user as java process has
,否则您的连接将被断开。Java并不关心您是否是root 用户。
基本上来说:
sudo -u <java_process_user> jcmd <pid> Thread.print
解决方案 2:
现在暂时解决这个问题。
添加'-XX:+StartAttachListener'
到 jvm 参数解决了该问题。
此处讨论了类似的问题,网址为https://code.google.com/p/jmockit/issues/detail?id=136和http://mail.openjdk.java.net/pipermail/macosx-port-dev/2013-October/006098.html (讨论了 jdk7 构建中可能出现的回归)
解决方案 3:
与 @bbarker 一样,我在 JDK 1.8.0_161 上使用 Windows 10 中的 Linux 子系统(“Windows 上的 Ubuntu 上的 Bash”)也遇到了同样的错误。使用上面提到的 JVM 参数配置 Surefire 插件也为我解决了这个问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<argLine>-XX:+StartAttachListener</argLine>
</configuration>
</plugin>
但是,即使没有上述操作,也可以从“正常”的 Windows 命令提示符运行测试。
解决方案 4:
我在尝试检查线程死锁时也遇到了类似的问题。您还可以使用命令jcmd <PID> Thread.print
在控制台上打印线程转储并检查程序是否存在死锁。您可以查看我的答案,其中包含有关Java 中死锁检测的步骤
解决方案 5:
我遇到了类似的问题,就我而言,将 JDK 供应商从 更改OPENJ9
为OPENJDK
解决了该问题。
解决方案 6:
-F 选项为我解决了这个问题。jcmd -F Thread.print
也可以使用这个:jmap -dump:live,format=b,file=heapdump.hprof -F
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件