java VirtualMachine.getSystemProperties()死锁

时间:2012-01-20 19:41:15

标签: java api jvm deadlock

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

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

在Windows机器上运行,如果我连接的VirtualMachine在attach和getSystemProperties调用之间关闭,getSystemProperties()将永远阻塞并在该线程中创建死锁。我已将该块追溯到WindowsVirtualMachine.connectPipe()。它是一种本机方法,因此在WindowsVirtualMachine.c connectPipe函数中调用ConnectNamedPipe。我在Windows机器上看到过一些关于ConnectNamedPipe死锁的帖子。我试过打断被阻止的线程,但是没有解锁线程。

我不太确定解决方法是什么,但我会考虑不使用Attach API(虽然我更喜欢坚持使用我当前的解决方案)。我正在使用Attach API来使用VirtualMachine.list()来获取在本地计算机上运行的JVM。然后从那里我使用它来获取系统属性并通过JMX连接到它们。我知道我可以使用库创建一个自定义解决方案,通过网络在进程之间进行通信,但我宁愿在进程之间使用os级别的通信,这就是我认为Attach API正在使用的。

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

1 个答案:

答案 0 :(得分:0)

在这种情况下你想要发生什么?像这样的问题的常见解决方案是让一个观察者线程等待线程完成任务,然后如果它没有在一段时间内完成它,则假设存在死锁并退出该过程。显然这是非常沉重的,但在这种情况下你没有其他的东西可以做到“正确”。