java VirtualMachine.getSystemProperties () тупик - PullRequest
5 голосов
/ 20 января 2012

Я использую 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()?

1 Ответ

0 голосов
/ 05 февраля 2012

что бы вы хотели случиться в этом случае? Распространенным решением для такой проблемы является наличие потока-наблюдателя, который ожидает, пока поток завершит задачу, а затем, если он не завершит ее в течение некоторого времени, предположим, что существует тупик, и выйдите из процесса. Очевидно, это довольно тяжело, но в этом случае вы не могли бы сделать что-то еще, что было бы «правильным».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...