JIT コンパイラー
Just-In-Time (JIT) コンパイラーは、実行時にバイトコードをネイティブ・マシン・コードにコンパイルすることによって Java™ アプリケーションのパフォーマンスを向上させるランタイム環境のコンポーネントです。
Java プログラムは、さまざまなコンピューター・アーキテクチャー上の JVM によって解釈できる、プラットフォームに依存しないバイトコードを含むクラスで構成されています。 ランタイムには、JVM がクラス・ファイルをロードし、個々のバイトコードの意味構造を判断し、適切な計算を実行します。 解釈中のプロセッサーおよびメモリーの使用量の増加は、Java アプリケーションの方がネイティブ・アプリケーションよりもパフォーマンスが遅いことを意味します。 JIT コンパイラーは、実行時にバイトコードをネイティブ・マシン・コードにコンパイルすることで、Java プログラムのパフォーマンスを向上させます。
JIT コンパイラーはデフォルトで有効になっています。 メソッドのコンパイルが完了すると、JVM はメソッドを解釈する代わりにそのメソッドのコンパイル済みコードを直接呼び出します。 理論的には、コンパイルがプロセッサー時間とメモリー使用量を必要としない場合、すべてのメソッドをコンパイルすることで、Java プログラムの速度をネイティブ・アプリケーションの速度と一致させることができます。
JIT コンパイルでは、プロセッサー時間とメモリーの使用が必要です。 JVM が最初に開始すると、何千ものメソッドが呼び出されます。 これらのメソッドをすべてコンパイルすると、プログラムのピーク時パフォーマンスが非常に良い場合であっても、起動時間に深刻な影響を及ぼすことがあります。
実際には、メソッドは初めて呼び出されたときにはコンパイルされません。 JVM は呼び出し回数をメソッドごとに保持します。この回数は、事前定義されたコンパイルしきい値から開始され、メソッドが呼び出されるたびに減ります。 呼び出し回数がゼロに達すると、そのメソッドの just-in-time コンパイルがトリガーされます。 したがって、頻繁に使用されるメソッドは JVM の開始後間もなくコンパイルされ、使用頻度のより低いメソッドはずっと後でコンパイルされるか、またはコンパイルされることがありません。 JIT コンパイルのしきい値は、JVM を素早く開始し、高いパフォーマンスを保つために有効です。 このしきい値は、起動時間と長期パフォーマンスの間の最適なバランスを達成するために選択されました。
JIT コンパイラーは、さまざまな最適化レベル ( cold、 warm、 hot、 veryHot、または scorching ) でメソッドをコンパイルできます ( -Xjitの optlevel を参照)。 パフォーマンスを向上させるには、最適化レベルを上げることが要求されますが、最適化レベルを上げると、CPU およびメモリーに関するコンパイル・コストも高くなります。 メソッドの初期/デフォルト最適化レベルは warm ですが、JIT ヒューリスティックによって最適化レベルが cold にダウングレードされて、起動時間が短縮されることがあります。
メソッドは、さまざまなメカニズムを使用して、より高い最適化レベルに再コンパイルできます。 これらのメカニズムの 1 つはサンプリングです。JIT コンパイラーは専用のサンプリング・スレッドを維持します。このスレッドは定期的にウェイクアップし、どの Java メソッドがスタックの先頭により頻繁に出現するかを判別します。 このようなメソッドは、パフォーマンスにとって、より重要とみなされ、より高いレベルの hot、veryHot、または scorching で再最適化される候補となります。
JIT コンパイラーを無効にすることができます。その場合、Java プログラム全体が解釈されます。 JIT コンパイルに関する問題の診断や対処を行う場合を除き、JIT コンパイラーを無効にすることは推奨されません。