開始エージェントVMの起動
実装後VMが起動した後にいつかエージェントを開始するの機構を提供することができます。これがどのように開始されるかに関する詳細は実装固有のですが、通常、アプリケーションはすでに開始されており、そのメインメソッドは既に呼び出されています。 VMが起動した後に実装がエージェントの起動をサポートする場合は、次のようになります。
エージェントJARのマニフェストにはAgent-Class属性が含まれている必要があります。この属性の値は、エージェントクラスの名前です。
エージェントクラスは、パブリックstatic agentmainメソッドを実装する必要があります。
システムクラスローダー(ClassLoader.getSystemClassLoader)は、システムクラスパスにエージェントJARファイルを追加するメカニズムをサポートしている必要があります。
システムクラスパスにエージェントJARが追加されます。これは、通常、アプリケーションのメインメソッドを含むクラスをロードするクラスローダです。エージェントクラスがロードされ、JVMはagentmainメソッドを呼び出そうとします。また
public static void agentmain(String agentArgs);
エージェントクラスをことがあります。その後、JVMを起動しようとするエージェントクラスは、このメソッドを実装していない場合は
public static void agentmain(String agentArgs, Instrumentation inst);
:JVMは最初のエージェントクラスに次のメソッドを呼び出そうエージェントがコマンドラインオプションを使用して起動されている場合には、事前に使用する方法があります。 VMの起動後にエージェントが起動されると、premainメソッドは呼び出されません。
エージェントには、agentArgsパラメータを介してエージェントオプションが渡されます。エージェントオプションは単一の文字列として渡され、追加の解析はエージェント自体によって実行される必要があります。
agentmainメソッドは、エージェントを起動するために必要な初期化を行う必要があります。起動が完了したら、メソッドはリターンするはずです。エージェントを起動できない場合(エージェントクラスをロードできない、エージェントクラスに適合するagentmainメソッドがないなど)、JVMは中断しません。 agentmainメソッドがキャッチされない例外をスローすると、無視されます。
これは、よりシンプルなエージェント用のjarファイルのオプションになる可能性がありますが、この特定のjarファイルはその内部にjarファイルがあります。また、 'agentmain()'メソッドを実装するラッパークラスを作成する必要がありました。クラスパスがロードしようとすると問題が発生します。 私は弾丸を噛んで 'agents'ディレクトリに追加し、起動スクリプトに追加すると思います。長期的に移行しているプラットフォームは、デプロイ時にこのエージェントのjarを自動的に検出するため、これを一時的な解決策として使用できます。 –
ランタイムアタッチメントは、クラスがまだアタッチ時にロードされないことを保証しません。しかし、ロードされたクラスは、異なる形状を許容せずに、異なるメソッド実装を提供するようにのみ変更することができます。 –