Java Language
ジャストインタイム(JIT)コンパイラ
サーチ…
備考
歴史
Symantec JITコンパイラはSun Java 1.1.5以降で使用できましたが、問題がありました。
Hotspot JITコンパイラはプラグインとしてSun Java 1.2.2に追加されました。 Java 1.3では、JITはデフォルトで有効になっていました。
概要
Just-In-Time(JIT)コンパイラは、実行時にJavaアプリケーションのパフォーマンスを向上させるJava™Runtime Environmentのコンポーネントです。
- Javaプログラムは、さまざまなコンピュータアーキテクチャ上のJVMによって解釈されるプラットフォーム中立バイトコードを含むクラスで構成されています。
- 実行時に、JVMはクラスファイルをロードし、個々のバイトコードのセマンティクスを決定し、適切な計算を実行します。
解釈中の追加のプロセッサーとメモリー使用量は、Javaアプリケーションがネイティブ・アプリケーションよりもゆっくりと実行されることを意味します。
JITコンパイラは、実行時にバイトコードをネイティブのマシンコードにコンパイルすることにより、Javaプログラムのパフォーマンスを向上させます。
JITコンパイラはデフォルトで有効になっており、Javaメソッドが呼び出されるとアクティブになります。 JITコンパイラは、そのメソッドのバイトコードをネイティブマシンコードにコンパイルし、実行するために"just in time"
コンパイルします。
メソッドがコンパイルされると、JVMはそれを解釈するのではなく、そのメソッドのコンパイル済みコードを直接呼び出します。理論的には、コンパイルにプロセッサー時間とメモリー使用が必要ない場合は、すべてのメソッドをコンパイルするとJavaプログラムの速度がネイティブ・アプリケーションの速度に近づく可能性があります。
JITコンパイルにはプロセッサー時間とメモリー使用量が必要です。 JVMが最初に起動すると、何千ものメソッドが呼び出されます。これらのメソッドをすべてコンパイルすると、たとえプログラムが最終的に非常に優れたピーク性能を達成したとしても、起動時間に大きな影響を与える可能性があります。
- 実際には、メソッドは最初に呼び出されたときにはコンパイルされません。メソッドごとに、JVMはメソッドが呼び出されるたびにインクリメントされる
call count
を保持しcall count
。 - コール・カウントがJITコンパイルのしきい値を超えるまで、JVMはメソッドを解釈します。
- したがって、頻繁に使用されるメソッドは、JVMの起動直後にコンパイルされ、あまり使用されないメソッドは、後でコンパイルされるか、まったくコンパイルされません。
- JITコンパイルのしきい値は、JVMの起動を早くし、パフォーマンスを向上させるのに役立ちます。
- 起動時間と長期性能との最適なバランスを得るために、しきい値が慎重に選択されています。
- メソッドがコンパイルされると、その呼び出しカウントはゼロにリセットされ、メソッドへのその後の呼び出しはそのカウントを増加し続けます。
- メソッドのコール・カウントがJIT再コンパイル・スレッショルドに達すると、JITコンパイラーはそれを2回コンパイルして、前のコンパイルよりも多くの最適化を適用します。
- このプロセスは、最大限の最適化レベルに達するまで繰り返される。
Javaプログラムの最も使用頻度の高いメソッドは、常に最も積極的に最適化され、JITコンパイラを使用することによるパフォーマンス上の利点を最大限に活用します。
JITコンパイラはoperational data at run time
測定operational data at run time
、そのデータを使用して、再コンパイルの品質を向上させることもできます。
JITコンパイラを無効にすることができます。この場合、Javaプログラム全体が解釈されます。 JITコンパイルの問題を診断または回避する場合を除いて、JITコンパイラを無効にすることはお勧めしません。