Подтвердить что ты не робот

Выполнить новый Java-код в существующем jvm-процессе

У меня есть java-процесс, который в настоящее время выполняется под оболочкой Windows.

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

Если я остановлю процесс, информация будет потеряна.

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

Процесс был запущен с помощью команды java -jar.

С помощью функций виртуальной машины Hotspot, есть ли способ достичь этого?

4b9b3361

Ответ 1

Вы можете использовать Attach API для присоединения к виртуальной машине. Здесь статья, в которой объясняется, как ее использовать

Вот пример кода:

String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);

Где агент - это имя вашей банки.

В банке агента содержится Agent, который может взаимодействовать с JVM с помощью API-интерфейса Instrumentation.

Чтобы создать агент, который загружается во время выполнения, вы реализуете функцию agentmain следующим образом:

public static void agentmain(String agentArgs, Instrumentation inst); 

или

public static void agentmain(String agentArgs); 

Объект Instrumentation используется для изменения классов во время выполнения, что вам, вероятно, и не нужно. Но, надеюсь, вы можете просто поставить любой код, который вам нужен для запуска в agentmain, а затем использовать API-интерфейс attach для запуска его в целевой JVM.

Удачи!

Ответ 2

Вы можете попробовать зарегистрировать обработчик сигналов, это более ограничено в Windows, чем на других платформах.

Примеры и описание http://www.ibm.com/developerworks/java/library/i-signalhandling/

Но вопрос в том, почему поток заблокирован?