Я использую Java Attach API для подключения к локальным JVM. я делаю что-то вроде следующего
VirtualMachine vm = VirtualMachine.attach("8400");
Properties props = vm.getSystemProperties();
, работающий на машине с Windows, если VirtualMachine, к которому я подключаюсь, завершает работу между вызовами присоединения и getSystemProperties, getSystemProperties()
навсегда блокирует и создает тупик в этом потоке. Я проследил блок до WindowsVirtualMachine.connectPipe()
. это нативный метод, поэтому в функции connectPipe в WindowsVirtualMachine.c есть вызов ConnectNamedPipe. Я видел несколько сообщений о взаимоблокировке ConnectNamedPipe на компьютерах с Windows. Я пытался прервать поток, который заблокирован, но это не разблокирует поток.
Я не совсем уверен, что обходной путь для этого, но я бы не стал использовать Attach API (хотя я предпочитаю придерживаться моего текущего решения). Я использую Attach API, чтобы использовать VirtualMachine.list()
для запуска JVM на локальном компьютере. а затем оттуда я использую это, чтобы получить системные свойства и подключиться к ним через JMX. я знаю, что, возможно, мог бы создать собственное решение, использующее библиотеку для связи между процессами по сети, но я бы предпочел использовать связь на уровне ОС между процессами, что, как я полагаю, использует Attach API.
так что мой вопрос: есть ли обходные пути для моей проблемы? или есть какие-нибудь библиотеки, которые могли бы дать мне такую же функциональность, как VirtualMachine.list()
?