2

JVMTIを使用して実装するプロファイラーについて、すべてのJavaメソッドの実行時間の測定を開始したいと思います。JVMTIは次のイベントを提供します。

  • MethodEntry
  • MethodExit

したがって、これは実装が非常に簡単ですが、APIでこのメモに出くわしました。

メソッドの開始イベントまたは終了イベントを有効にすると、多くのプラットフォームでパフォーマンスが大幅に低下するため、パフォーマンスが重要な使用法(プロファイリングなど)についてはお勧めしません。このような場合は、バイトコードインストルメンテーションを使用する必要があります。

しかし、私のプロファイリングエージェントはヘッドレスで動作します。つまり、収集されたデータはシリアル化され、ソケットを介してサーバーアプリケーションに送信され、結果が表示されます。バイトコードインストルメンテーションを使用してこれをどのように実現する必要がありますか。ここから先に進む方法が少し混乱しています。戦略を切り替える必要がある場合、またはこの問題にどのように取り組むことができるか、誰かが私に説明してもらえますか?

4

1 に答える 1

1

Sun JVM についてはわかりませんが、IBM JVM は、MethodEntry/Exit イベントを要求すると、FullSpeedDebug モードと呼ばれるものに入ります.... FSD は実行をかなり遅くします。

あなたが言うように、私のプロファイラーと同じように BCI を使用できますが、インストルメントする方法を選択しない限り、速度が低下することもわかります。たとえば、私のプロファイラーは、すべてのエントリに if(profiling) callProfilerHook() を挿入し、すべてのオブジェクトが作成するメソッド内のすべての可能な終了と、その他の領域も同様に....これらの追加のチェックにより、実行が 50% 以上遅くなる可能性があります。 ..

BCIの方法については...まあ、それを行うために独自のCライブラリを作成しました...技術的には難しくありません(ヒントはStackMapTableを削除するだけです)が、しばらく時間がかかる場合があります..または、ASM etを使用することもできます. アル。

最後に...callBackHookはオーバーヘッドを追加し、小さなメソッドでは、洗練されたオーバーヘッド計算を実行しない限り、報告されたCPU /クロック時間を無意味にレンダリングします...これを行ったとしても、コールバックコードはプロセッサのL1キャッシュとJavaの形状に影響しますスペースが少ないため、コードの効率が低下します。

私のプロファイラーは、興味深い方法で実行を視覚化するため、基本的に報告された時間を無視します...私はすべてのコードの流れを理解しようとしています。実際、ほとんどの場合、どのコードが実行されているかを知りませんアプリで実行されている数百万行のサードパーティ コード)

于 2011-05-11T11:34:14.470 に答える