У меня есть процесс Java, в настоящее время работающий под оболочкой окон.
Один из потоков, ответственных за сериализацию, заблокирован неограниченно долго и в результате важная информация, которая хранится в памяти, больше не пишется в диск.
Если я завершу работу процесса, то информация будет потеряна.
Было бы удобно, если я мог бы записать и скомпилировать некоторый новый код и иметь его, выполняются в том же пространстве памяти так, чтобы упомянутая информация могла быть сериализирована еще раз, прежде чем я завершу работу процесса.
Процесс был запущен с помощью a java -jar
команда.
С функциями VM горячей точки, там какой-либо способ достигнуть этого?
Вы можете использовать API API , чтобы прикрепить к виртуальной машине. Вот статья, которая объясняет, как его использовать
, вот пример кода:
String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);
, где агент - это имя вашей банки.
Банка агента содержит агент , который может взаимодействовать с JVM с использованием API приборов.
Чтобы создать агента, который загружается во время выполнения, вы реализуете функцию Agentmain
, такие как это:
public static void agentmain(String agentArgs, Instrumentation inst);
или
public static void agentmain(String agentArgs);
. Приборы используются для изменения классов во время выполнения , что вам, вероятно, не нужно. Но, надеюсь, вы просто можете поставить любой код, который вам нужен в AgentMain, а затем используйте ATCOR API для запуска его в целевой JVM.
Удачи !!
Вы можете попробовать регистрацию обработчика сигнала, это более ограничено Окна, чем на других платформах.
Примеры и описание http://www.ibm.com/developerworks/java/library/i-signalhandling/
Но вопрос, который нужно задать, почему поток заблокирован?