5

バイト コード インストルメンテーションを使用してプロファイラーを実現したい場合、 JVMTIを使用してネイティブ エージェントを作成する必要がありますか、それともパッケージを使用してJava エージェントを作成する必要がありますか?java.lang.instrument

ASMのようなライブラリを使用したい場合 (本格的なプロファイラーを作成する場合は必須のようです)、Java エージェントを使用する必要があります。ネイティブ エージェントは Java エージェントができることすべてを実行できると思っていたので、これは私を混乱させます。しかし、私には、Java エージェントを作成する方が簡単に思えます。

代替手段はありますか?とにかくJavaエージェントとネイティブエージェントを組み合わせて使用​​する必要がありますか?

4

1 に答える 1

5

C/C++ バイトコード インストルメンタをゼロから作成する必要がないため、ほぼすべての人が (ASM または BCEL を使用して) Java エージェントを作成します。公開されているものはありません。

できないことは、原始的な JVM の計測とプロファイリング/監視であり、ネイティブ関数へのアクセスには JNI 呼び出しが必要です。また、使用できない可能性のある JVMTI 呼び出しがいくつかあります (メモリが機能している場合)。

私は数年前に C で自分のインストルメンタを書きましたが、オープンソースにしたい新しいものを書いているところです (私の邪悪な大君主次第です :-) )

中途半端な家、ネイティブエージェントがバイトコードを送信する事前に開始された別のJVMはどうですか。その JVM では、簡単に作成できる ASM ベースのインストルメンタが大変な作業を行い、結果のバイトコードをネットワーク経由でネイティブ エージェントに送り返します。ええ、少し複雑すぎるようですが、独自の BCI ライブラリを作成する方が簡単です。

于 2011-09-06T17:44:08.157 に答える