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コンパイラーは、さまざまな最適化レベル(coldwarmhotveryHot、または scorching)でメソッドをコンパイルできます(-Xjitoptlevelを参照)。 パフォーマンスを向上させるには、最適化レベルを上げることが要求されますが、最適化レベルを上げると、CPU およびメモリーに関するコンパイル・コストも高くなります。 メソッドの初期またはデフォルトの最適化レベルはwarmですが、起動時間を改善するために JIT ヒューリスティックが最適化レベルをcoldにダウングレードすることがあります。

メソッドは、さまざまなメカニズムを使用して、より高い最適化レベルに再コンパイルできます。 これらのメカニズムの 1 つとしてサンプリングがあります。 JIT コンパイラーは、定期的にウェイクアップする専用サンプリング・スレッドを維持し、どの Java メソッドがより頻繁にスタックの先頭に位置するのかを判別します。 このようなメソッドは、パフォーマンスにとってより重要であると見なされ、より高いレベルのhotveryHot、またはscorchingで再最適化される候補になります。

JIT コンパイラーは無効にできます。 その場合、Java プログラム全体が解釈されます。 JIT コンパイルに関する問題の診断や対処を行う場合を除き、JIT コンパイラーを無効にすることは推奨されません。