Java仮想マシン-コンパイルレベル

JVMは5つのコンパイルレベルをサポートします-

  • Interpreter
  • 完全に最適化された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 and 64b。C2は64b

階層型コンパイル

Javaの古いバージョンでは、ユーザーは次のオプションのいずれかを選択できた可能性があります-

  • 通訳(-Xint)
  • C1(-クライアント)
  • C2(-サーバー)

これはJava7で提供されました。C1コンパイラを使用して起動し、コードが熱くなるとC2に切り替わります。次のJVMオプションでアクティブ化できます:-XX:+ TieredCompilation。デフォルト値はset to false in Java 7, and to true in Java 8

コンパイルの5つの層のうち、層状のコンパイルは 1 -> 4 -> 5