26

同じVM内から仮想マシンの起動後にjavaagentを挿入することはできますか?

たとえば、適切なメタデータが設定され、agentmainメソッドがすでに実装されているエージェントがjarmyagent.jarにあるとします。ここで、ユーザープログラムはAPI呼び出しを呼び出します。これにより、クラスが再定義できるようにエージェントが挿入されます。

それはどのように行うことができますか?

4

4 に答える 4

20

https://web.archive.org/web/20141014195801/http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/には、記述方法の優れた例がありますエージェントとその場でエージェントを開始する方法。

于 2010-12-18T04:04:05.093 に答える
15

はい、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();
  }
}                                                                                                            
于 2014-10-30T20:24:27.410 に答える
4

Java 6 で実行できるはずです。パッケージ ドキュメントの章「Starting Agents After VM Startup」を参照してください。

編集:Java 5ではすでに可能だったのかもしれませんが、javadocsだけでは明示的に言及されていませんでした

于 2009-08-14T11:01:55.193 に答える