同じVM内から仮想マシンの起動後にjavaagentを挿入することはできますか?
たとえば、適切なメタデータが設定され、agentmainメソッドがすでに実装されているエージェントがjarmyagent.jarにあるとします。ここで、ユーザープログラムはAPI呼び出しを呼び出します。これにより、クラスが再定義できるようにエージェントが挿入されます。
それはどのように行うことができますか?
同じVM内から仮想マシンの起動後にjavaagentを挿入することはできますか?
たとえば、適切なメタデータが設定され、agentmainメソッドがすでに実装されているエージェントがjarmyagent.jarにあるとします。ここで、ユーザープログラムはAPI呼び出しを呼び出します。これにより、クラスが再定義できるようにエージェントが挿入されます。
それはどのように行うことができますか?
https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/には、記述方法の優れた例がありますエージェントとその場でエージェントを開始する方法。
はい、JVM プロセス ID をVirtualMachine.attach(String pid)
メソッドに渡し、エージェント jar をロードするだけです。このVirtualMachine
クラスは、JDK_HOME/lib/tools.jar ファイルで使用できます。実行時にエージェントをアクティブにする方法の例を次に示します。
public static void attachGivenAgentToThisVM(String pathToAgentJar) {
try {
String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@'));
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent(pathToAgentJar, "");
vm.detach();
} catch (Exception e) {
e.printStackTrace();
}
}
Java 6 で実行できるはずです。パッケージ ドキュメントの章「Starting Agents After VM Startup」を参照してください。
編集:Java 5ではすでに可能だったのかもしれませんが、javadocsだけでは明示的に言及されていませんでした