1

MethodEntryJVMTI が提供するおよびイベント フックを使用してMethodExit、Java で実行されたメソッドの時間をどのように測定しますか?

簡単に言うと、次のとおりです。time2 - time1しかし、私が見る問題は、さまざまな方法をどのように区別するのですか? methodID はありますが、再帰呼び出しはどうでしょうか。メソッドを開いた後、メソッドを閉じるのはいつですか?

スタック トレースを比較する必要がありますか? 入力されたメソッドを追跡するための意味のあるデータ構造は何でしょうか? 何かのようなものMap<StackTrace,Time>?

4

1 に答える 1

5

すべてのスレッドにスタックが必要であり、スタックにMethodEnterタイムスタンプをプッシュするたびに、タイムMethodExitスタンプをポップして現在の時刻との差を計算します。

ただし、タイムスタンプやティックカウント、および周囲のロジックの読み取りには比較的時間がかかることに注意してください。ある種のプロファイラーでこのようなものを使用すると、小さな高速メソッドが非常に高価に見える結果が得られます。つまり、ByteBuffer.get()測定コードよりも少なくとも 10 倍速く実行される可能性があります。JVMTI がアクティブな場合に JIT コンパイルが制限されることによる歪みと合わせて、このようなメソッドは、収集されたデータにおいて、通常の状況下よりも 100 倍も重いように見えることがあります。メソッドの実行時間シェアのある程度使用可能なデータを取得する唯一の方法は、サンプリングを使用することです。

于 2011-06-03T15:30:13.977 に答える