Как выгрузить JVM из живого процесса? - PullRequest
4 голосов
/ 06 июня 2010

Я работаю с JNI и пытаюсь выгрузить (уничтожить) виртуальную машину с помощью функции DestoryJavaVM (сначала я вызываю метод DetachCurrentThread). Похоже, что теперь он влияет на виртуальную машину, и он все еще работает после вызова. Я читал в старых сообщениях Sun, что у DestoryJavaVM были проблемы в прошлом (JDK1.1-1.3 в 2001 году), но я использую JRE 6, и это, вероятно, должно работать сейчас, верно? Мне нужно загрузить \ выгрузить виртуальную машину в одном и том же живом процессе, поскольку для каждой загрузки требуются другие классы для загрузки. Есть идеи как это можно сделать?

Дополнительная информация:

На этапе выгрузки я могу успешно отключитьCurrentThread и destroyVM (оба возвращают JNI_OK). Я даже FreeLibray (jvm.dll) успешно (возврат 1). Когда я пытаюсь загрузить JVM снова, я могу LoadLibrary (), затем найти функцию CreateVM в DLL, и вызов CreateVM завершается неудачно (возврат -1). Что я тут не так делаю?

Спасибо, Guy

Ответы [ 3 ]

2 голосов
/ 06 июня 2010

Хотя это не ответит на ваш вопрос на DestroyJavaVM.

Мне приходит в голову OSGi, вы можете поместить все классы в пакет, активировать его код выполнения и деактивировать его, а затем использовать другой пакет.См. Apache Felix .

Другим менее элегантным вариантом будет выход из виртуальной машины и перезапуск с другим путем к классам.

1 голос
/ 07 июня 2010

Вы можете проверить наличие ошибочных тем. В API вызова: выгрузка виртуальной машины упоминается: «Виртуальная машина ждет, пока текущий поток не станет единственным пользовательским потоком, не являющимся демоном, прежде чем он действительно выгружается» Это требуется в соответствии с спецификацией языка Java, 12,8 .

0 голосов
/ 28 августа 2014

DestroyJavaVM() не поддерживает выгрузку ВМ.

DestroyJavaVM

Выгрузка виртуальной машины Java и восстановление ее ресурсов.

Любой поток, независимо от того, присоединен он или нет, может вызывать эту функцию. Если текущий поток подключен, виртуальная машина ожидает, пока текущий поток не станет единственным не-демоническим потоком Java уровня пользователя. Если текущий поток не подключен, виртуальная машина присоединяет текущий поток и ждет, пока текущий поток не станет единственным потоком уровня пользователя, не являющимся демоном.

[...]

Выгрузка виртуальной машины не поддерживается.

Поначалу документация может показаться немного противоречивой. Что вы можете сделать, так это уничтожить виртуальную машину без проблем, но, поскольку она не выгружается должным образом, вы никогда не сможете перезагрузить ее снова в том же процессе.

...