現在、プロファイラーが内部でどのように機能するかを調査中です。
JVMPIという名前の古いAPIと、に基づく「新しい」APIがあるようjava.lang.instrument
です。私は、プロファイラーがすべてのクラスのバイトコードを計測し、ソケット情報を介して特定のプログラムのオープンポイントを呼び出すフックを挿入することで、プロファイラーとの通信を確立することを考えました。これは標準的なアプローチですか?アプローチはかなり異なりますか?
ありがとう
参考までに、「 JVMTIはJDK5.0で導入されました。JVMTIは、Java仮想マシンプロファイラインターフェイス(JVMPI)およびJava仮想マシンデバッグインターフェイス(JVMDI)に置き換わるものです。」標準のプロファイラーは、ここでjvisualvm
提案されているように、たとえばガベージコレクションを実行および監視するためにAPIを広範囲に使用します。Java Management Extensions(JMX)は、一般的な通信レイヤーです。
私はこれに関する専門家ではありませんが、JVMPIとJVMTIの動作は異なるようです。
JVMPIは、プロファイリングが有効になっているときにJVMが発行する「イベント」を処理するエージェントによって機能するようです。イベント発行ロジックがJVMに組み込まれているようです。
JVMTIは、ロード時にエージェントにメソッドにバイトコードを挿入させることで(プロファイリングのために)機能するようです。
(これは、上記のリンクにあるように、それぞれの仕様を簡単に読んだものです。)