выполнить новый код Java в существующем процессе JVM - PullRequest
12 голосов
/ 25 января 2010

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

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

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

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

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

С возможностями виртуальной машины в точке доступа есть ли способ добиться этого?

Ответы [ 2 ]

12 голосов
/ 25 января 2010

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

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

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

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

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

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

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

или

public static void agentmain(String agentArgs); 

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

Удачи !!

0 голосов
/ 25 января 2010

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

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

Но вопрос, который нужно задать, - почему тема заблокирована?

...