Java-virtual-machine-compilation-levels
Java仮想マシン-コンパイルレベル
JVMは5つのコンパイルレベルをサポートしています-
- 通訳
- 完全に最適化されたC1(プロファイリングなし)
- 呼び出しおよびバックエッジカウンターを備えたC1(ライトプロファイリング)
- 完全なプロファイリングを備えたC1
- C2(前の手順のプロファイリングデータを使用)
すべてのJITコンパイラを無効にし、インタープリターのみを使用する場合は、-Xintを使用します。
クライアント対 サーバーJIT
-clientおよび-serverを使用して、それぞれのモードをアクティブにします。
クライアントコンパイラ(C1)は、サーバーコンパイラ(C2)よりも早くコードのコンパイルを開始します。 そのため、C2がコンパイルを開始するまでに、C1はすでにコードのセクションをコンパイルしていました。
しかし、待機中、C2はコードをプロファイリングして、C1よりもコードを認識します。 したがって、最適化によるオフセットを使用してはるかに高速なバイナリを生成できる場合に待機する時間。 ユーザーの観点から見ると、トレードオフはプログラムの起動時間とプログラムの実行にかかる時間の間です。 起動時間が重要な場合は、C1を使用する必要があります。 アプリケーションが長時間実行されることが予想される場合(通常、サーバーにデプロイされるアプリケーションの場合)、C2を使用すると、余分な起動時間を大幅に相殺するはるかに高速なコードが生成されるため、より適切です。
IDE(NetBeans、Eclipse)などのプログラムやその他のGUIプログラムでは、起動時間が非常に重要です。 NetBeansの起動には1分以上かかる場合があります。 NetBeansなどのプログラムを起動すると、数百のクラスがコンパイルされます。 このような場合、C1コンパイラーが最適です。
C1には2つのバージョンがあることに注意してください- 32bおよび64b 。 C2は 64b でのみ提供されます。
階層型コンパイル
Javaの古いバージョンでは、ユーザーは次のオプションのいずれかを選択できました-
- 通訳者(-Xint)
- C1(-クライアント)
- C2(-サーバー)
Java 7で提供されました。 C1コンパイラを使用して起動し、コードが熱くなるとC2に切り替えます。 JVMオプション-XX:+ TieredCompilationでアクティブ化できます。 デフォルト値は* Java 7ではfalseに設定され、Java 8ではtrueに設定されます*。
5段階のコンパイルのうち、段階コンパイルでは 1→ 4→ 5 を使用します。