14

現在、Windowsシェルで実行されているJavaプロセスがあります。

シリアル化を担当するスレッドの1つが無期限にブロックされ、その結果、メモリに格納されている重要な情報がディスクに書き込まれなくなります。

プロセスをシャットダウンすると、情報が失われます。

プロセスをシャットダウンする前に、新しいコードを記述してコンパイルし、同じメモリスペースで実行して、上記の情報をもう一度シリアル化できると便利です。

java -jarコマンドを使用してプロセスを開始しました。

ホットスポットVM機能を使用して、これを実現する方法はありますか?

4

2 に答える 2

12

Attach APIを使用して、仮想マシンに接続できます。 使い方を解説した記事はこちら

コード例を次に示します。

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

エージェントは、jar の名前です。

エージェント jar にはAgentが含まれており、インストルメンテーション API を使用して JVM とやり取りできます。

実行時に読み込まれるエージェントを作成するには、次のagentmainような関数を実装します。

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

また

public static void agentmain(String agentArgs); 

Instrumentationオブジェクトは、実行時にクラスを変更するために使用されますが、これはおそらく必要ありません。しかし、実行に必要なコードを agentmain に配置し、attach API を使用してターゲット JVM で実行できることを願っています。

幸運を!!

于 2010-01-25T05:48:47.500 に答える
0

シグナル ハンドラーの登録を試みることもできますが、これは Windows では他のプラットフォームよりも制限されています。

例と説明 http://www.ibm.com/developerworks/java/library/i-signalhandling/

しかし、尋ねるべき質問は、なぜスレッドがブロックされているのかということです。

于 2010-01-25T06:17:04.207 に答える