java VirtualMachine.getSystemProperties()死锁

mik*_*key 5 java api deadlock jvm

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

VirtualMachine vm = VirtualMachine.attach("8400");
Properties props = vm.getSystemProperties();
Run Code Online (Sandbox Code Playgroud)

在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()

luk*_*uke 0

在这种情况下你希望发生什么?对于此类问题的常见解决方案是让一个观察程序线程等待该线程完成任务,然后如果它在一段时间内没有完成任务,则假设存在死锁并退出进程。显然,这是相当严厉的,但在这种情况下,你没有什么其他可以做的“正确”的事情。