私はjProfilerを広く使用しています。これは素晴らしいツールですが、jProfilerがJITコンパイルの効果をどのように処理しているのか疑問に思っています。
ジャストインタイムコンパイルは実際にはHotSpot適応オプティマイザに取って代わるかなり古い技術です。 JITは、すべてのメソッドをJavaバイトコードからネイティブコードに盲目的にコンパイルします。それをうまく最適化できるかどうかは不明です。
しかし、適応オプティマイザは、コードがのところでどのように実行されるかを調べて、を実行し、最も頻繁に実行されるコードのみを最適化します。オプティマイザはのコードをどのように使用しているのかを認識しているため、オプティマイザはより良いインライン展開、分岐予測、ロック粗密化、ループ解消などを行うことができます。
私はメソッドのインライン化を観察できますか?メソッドがインライン化されている場合は、スナップショットには表示されませんが、実行時間を計算できるjProfilerですか?
JProfilerは、どのメソッドがインライン化されたかを報告しません。しかし、たとえコンパイラが別の方法でインライン展開されていても、喜んで呼び出しを報告します。
どのようにですか?さて、コンパイル時に、コンパイラはネイティブコードのメソッド境界をデマールします。これは、JVMが例外またはエラーが発生したときにスタックトレースを再構築できるようにするために不可欠です。 JVMがサンプリングされると、JVMは実行中のスレッドのスタックトレースで応答し、インライン化されていても現在のメソッドが正確に報告されます。
同様に、副作用がなく完全に最適化できる方法もjProfilerには表示されません。これは正しいです?
ほとんど正しいです。副作用や計算された戻り値や副作用の可能性のある別のメソッドへの呼び出しは、ほとんど完全に最適化されています。しかしというメソッドが記録されていることをJVMに記録しています。マージナルオーバーヘッドは非常に小さいですが、以下の興味深い特性があります。
- サンプリングが、この方法が今までサンプリングの瞬間にスタック上になる可能性はほとんどありませんので、ほとんどの場合ではありませんjProfiler(または他のサンプリングプロファイラ)によって検出されます。
- の場合、プロファイラはすべてのメソッド呼び出しをトレースし、はメソッド呼び出しを検出します。上記のように、総コストはごくわずかです。
サンプリングと計測の違いについては、this articleで説明しています。
偉大な答えは、私が探していたものです。私はほとんどの時間を計測しているので、プロファイラはすべてのメソッド呼び出しを表示することがわかります。 –