java VirtualMachine.getSystemProperties() 死锁

标签 java api jvm deadlock

我正在使用 Java Attach API 连接到本地 JVM。我正在做类似下面的事情

VirtualMachine vm = VirtualMachine.attach("8400");
Properties props = vm.getSystemProperties();

在 Windows 机器上运行,如果我连接的 VirtualMachine 在附加和 getSystemProperties 调用之间关闭,getSystemProperties() 将永远阻塞并在该线程中创建死锁。我已经追踪到 WindowsVirtualMachine.connectPipe() block 。这是一个 native 方法,因此在 WindowsVirtualMachine.c connectPipe 函数中有一个对 ConnectNamedPipe 的调用。我看过一些关于 Windows 机器上的 ConnectNamedPipe 死锁的帖子。我试过中断被阻塞的线程,但这并没有解除线程的阻塞。

我不太确定解决此问题的方法是什么,但我会考虑不使用 Attach API(尽管我更愿意坚持我当前的解决方案)。我正在使用 Attach API 来使用 VirtualMachine.list() 让 JVM 在本地机器上运行。然后从那里我使用它来获取系统属性并通过 JMX 连接到它们。我知道我可以使用库创建自定义解决方案以通过网络在进程之间进行通信,但我更愿意在进程之间使用操作系统级别的通信,我相信 Attach API 正在使用这种方式。

所以我的问题是我的问题有什么解决方法吗?或者是否有任何库可以提供与 VirtualMachine.list() 相同的功能?

最佳答案

在这种情况下你希望发生什么?像这样的问题的一个常见解决方案是让一个观察线程等待线程完成任务,然后如果它在一段时间内没有完成它,则假设存在死锁并退出进程。显然,这是非常严厉的做法,但在这种情况下,您无能为力是“正确的”。

关于java VirtualMachine.getSystemProperties() 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946978/

相关文章:

java - XML 命名空间在 XPath + java 中解析文件时出现问题

api - Bing map API - 按域名搜索无法一致工作?

java - 用java制作heroku分析工具

java - jVisualVM中采样和分析的区别

java - 在 Java/Clojure 中将 UTF-32 编码的字符串(C 样式)转换为 UTF-16(JSON 样式)编码的字符串

java - 使用 Maven 构建 Spring 和 Spring Security 3.1

java - 如何在Tomcat服务器上发布运行时生成的非Java资源?

facebook - 获取 Facebook 的索引电影、音乐、学校等

node.js - Express/Node 应用程序的经过身份验证的登录架构

clojure - 为什么 Clojure 而不是其他 JVM Lisps : Kawa, Armed Bear 或 SISC?