5

Java でのバイトコード計測には、asm フレームワークと bcel および javaassist ライブラリがあります。

ただし、javaagent が実行されるまでに一部の Java クラス (java.lang.Thread、java.lang.Class など) がすでにロードされているため、ネイティブ コードで計測を行う必要があります。

ネイティブ コードで Java クラスを計測するためのライブラリはありますか?

編集:少し混乱しているようです。

私が望むのは: OnClassLoad イベントフックを使用して、JVMTI API を使用してロード中にクラスのバイトコードを変更するネイティブ Java エージェントを作成することです。

4

3 に答える 3

8

博士課程の研究中にこの問題に遭遇しました。私にとって最も効果的な答えは、Java ライブラリを使用して別の JVM でバイトコードの変更を実行することでした (私は ASM を使用しました)。

JVMTI クラス ロード フックを使用してクラス ファイルをキャプチャし、TCP 接続を使用して別の JVM に送信しました。別の JVM 内でクラスが変更されたら、それを JVMTI エージェントに返しました。JVMTI エージェントはそれを VM メモリにコピーし、変更されたクラス ファイルへのポインタを JVM に返します。

変更したいシステム クラス ファイル (java.lang.Object など) は、ウィービングを実行するために必要なクラス ファイルの前にロードする必要があるため、プロファイリングされているのと同じ JVM 内でクラスをウィービングするのは非常に困難であることがわかりました。 . 最終的に使用した別の JVM アプローチに落ち着く前に、c/c++ バイトコード ライブラリを探しましたが、あまり成功しませんでした。

要件に応じて、ウィーバー JVM のホスト名/ポートを使用して JVMTI エージェントをパラメーター化するか、何らかの形式の検出を使用できます。

于 2012-02-14T15:44:54.340 に答える
3

JIT は、バイト コードをネイティブ コードに変換します。ネイティブ コードを生成する場合は、JIT に任せるか、JNI 経由で呼び出されるネイティブ コードを記述する必要があります。

おそらく、あなたが達成しようとしていることは、別の方法でより簡単に行うことができます。

OnClassLoad イベント フックを使用して、ロード中に JVMTI API を使用してクラスのバイトコードを変更するネイティブ Java エージェントを作成します。

あなたがしたいことをする必要はありませんが。ソリューションを必要以上に複雑にする (そして機能する可能性を低くする) のはなぜでしょうか?

于 2012-01-22T13:57:46.673 に答える
-2

クラスがロードされると、クラスのバイト コードを変更することはできません。インストルメンテーションがロードされる前に実行されることを確認するか、新しい ClassLoader を作成し、親クラスに要求せずにクラスを再ロードすることができます。ただし、ClassLoader の外部にロードされたコードでこれらのクラスを使用することはできません。そのコードは、以前にロードされた変更されていないクラスを参照するためです。

于 2012-01-22T12:21:59.620 に答える