16

Java JIT はいつメソッド呼び出しをインライン化しますか? 呼び出し元メソッドが呼び出された #times に基づいているか (はいの場合、その数は?)、またはその他の基準に基づいていますか? (それは何ですか?)

JITは「最終」メソッドをインライン化できることを読みましたが、ランタイム統計に基づいて非最終メソッドもインライン化するため、そのトリガー基準が何であるかを知りたいです。

答えは JVM の実装によって異なると思いますが、それらすべてに共通するものがあるのではないでしょうか?

4

3 に答える 3

19

簡単な答えは、いつでも好きなときにです。

非常に多くの場合、JITCは、最初に統計を収集することなく、小さなfinalまたはpseudo-finalメソッドを自動的にインライン化します。これは、インライン化によって、呼び出しのコーディングと比較して実際にコードバイトが節約されることを簡単に確認できるためです(または、少なくとも「ウォッシュ」に近いこと)。

予期しないサブクラスが発生した場合に備えて、インライン化された非ファイナルメソッドを何らかの方法で「保護」する必要があるため、統計で価値があることが示唆されない限り、真に非ファイナルメソッドのインライン化は通常行われません。

JITCまたはインライン化される前に何かが呼び出される可能性がある回数に関しては、それは非常に可変であり、実行中のJVM内でも変化する可能性があります。

于 2012-04-09T12:21:28.430 に答える
8

サーバー Hotspot コンパイラーを実行する JVM のデフォルトのインラインしきい値は 35 バイトコードです。

公式ドキュメント

于 2014-05-30T06:36:16.807 に答える
2

通常、JIT はデフォルトで「小さい」メソッドのみをインライン化します。それ以外は、実装に完全に依存しています。

于 2012-04-09T12:18:33.990 に答える