5

Spring は-javaagent、AspectJ の読み込み時間を機能させるために vm オプションの使用を避け、代わりにクラスローダーに依存してエージェントを起動することを理解しています。

Java 仕様では、Java エージェントを使用する唯一の方法は-javaagentvm オプションを使用することであると規定されていると思いました。

私が間違っている?私の質問を明確にする公式の Java 仕様/ドキュメントを教えてもらえますか?

4

2 に答える 2

3

この興味深いブログ投稿で、 Java エージェントのロードに関する情報を見つけました。

インスツルメンテーション エージェント JVM インスツルメンテーションを有効にするには、JAR ファイルとしてデプロイされるエージェント (またはそれ以上) を提供する必要があります。JAR ファイル マニフェストの属性は、エージェントを開始するためにロードされるエージェント クラスを指定します。

エージェントをロードするには、次の 2 つの方法があります。

  • コマンドライン インターフェースを使用する場合: コマンドラインに次のオプションを追加します: -javaagent:jarpath[=options] ここで、jarpath はエージェント JAR ファイルへのパスです。options はエージェントのオプションです。このスイッチは、同じコマンドラインで複数回使用できるため、複数のエージェントが作成されます。複数のエージェントが同じ jarpath を使用する場合があります。
  • 動的ロードによる: JVM は、VM の起動後にエージェントを起動するメカニズムを実装する必要があります。そうすれば、ツールは実行中の JVM にエージェントを「アタッチ」できます (たとえば、プロファイラーや ByteMan)。

JVM が初期化された後、エージェント クラスはシステム クラス ローダーによってロードされます。クラスローダーがエージェントのロードに失敗した場合、JVM は異常終了します。...

はい、公式のドキュメント/仕様は大歓迎です...

編集 1 : 最後に、いくつかの関連する公式ドキュメントに出くわしました: 上記の 2 番目の箇条書きで説明されているエージェントを動的にロードするための API Javadoc: VirtualMachine クラスについては here をloadAgent メソッドについては here を参照してください。

編集 2 :この他のブログ投稿も参照してください。起動時の javaagent の静的ロードと実行時の javaagent の動的ロードの違いを明確に説明しています。

于 2014-03-24T12:16:35.610 に答える
0

ここでは、インストルメンテーションを挿入することにより、実行時にspectjとspring-aspectsを初期化するライブラリ: https://github.com/subes/invesdwin-instrument

したがって、明示的な -javaagent 引数はもう必要ありません。

于 2015-08-03T13:21:37.030 に答える