4 コンパイル最適化
このトピックでは、コンパイルを最適化するためにOracle JRockitおよびHotSpotで使用可能な様々なコンパイラ・オプションを説明します。
コンパイラ考慮事項
Oracle JRockitとは異なり、HotSpotには2つの異なるJust In Time (JIT)コンパイラ(クライアント(C1とも呼ぶ)およびサーバー(C2とも呼ぶ))に加え、Javaバイト・コード・インタプリタの特徴があります。
この項では、使用可能なコンパイラについて詳しく説明します。
HotSpot VMはデフォルトでJavaバイト・コードを解析します。事前定義された回数だけ実行されるメソッドをコンパイルします(JITコンパイル)。JITコンパイラは、クライアントまたはサーバー・コンパイラです。
-
クライアント・コンパイラ: メソッドをすばやくコンパイルしますが、サーバー・コンパイラほどは最適化されないマシン・コードを生成します。このコンパイラを使用すると、迅速に起動します。また、このコンパイラでは、少ないメモリー・フットプリントが定常パフォーマンスより重要です。
-
サーバー・コンパイラ: このコンパイラは、同じメソッドのコンパイルにより多くの時間がかかります(およびより多くのメモリーを消費します)。ただし、クライアント・コンパイラで生成したコードより最適化されたマシン・コードを生成します。アプリケーションが定常に達した後は、実行時パフォーマンスが向上します。
階層型コンパイルは、クライアント・コンパイラを1番目の階層として使用することで、サーバーのVM速度を高速化します。サーバーVMは、インタプリタを使用してコンパイラに渡されるメソッドについてのプロファイリング情報を収集します。階層型方式では、インタプリタに加えてクライアント・コンパイラはメソッドのコンパイル・バージョンを生成し、それらが自身のプロファイリング情報を収集します。コンパイルされたコードはインタプリタよりもはるかに高速なため、このプロファイリング段階の実行パフォーマンスが大きく向上します。サーバー・コンパイラによって生成される最終コードをアプリケーション初期化の早い段階で利用できるため、多くの場合起動速度を向上させることができます。階層型スキームは、通常のサーバーVMより優れたピーク・パフォーマンスを実現する可能性もあります。これは、プロファイリング段階が高速化することでプロファイリングにかけられる時間が長くなるため、最適化の向上につながるためです。
階層型コンパイルはサーバーVMのデフォルト・モードです。64ビット・モードがサポートされています。階層型コンパイルを手動で有効化するには、-XX:+TieredCompilation
フラグを使用します。-XX:-TieredCompilation
フラグを使用すると、階層型コンパイルを無効化できます。
Oracle JRockit JVMはJavaメソッドをコンパイルし、最初に起動されたときにJavaメソッドのマシン・コードを生成します。この頻繁に起動されるメソッドのコンパイルされたコードは、オプティマイザ・スレッドによってバックグラウンドで最適化されます。このコードは、メソッドが最初に解析され、後にクライアント・コンパイラ(最適化が少ない)またはサーバー・コンパイラ(最適化が多い)によってコンパイルされるHotSpotとは完全に異なります。
コンパイラ・コントロール
コンパイラ・コントロールによって、JVMのコンパイラを制御する方法が改善されます。JVMコンパイルはコンパイラ・ディレクティブ・オプションを使用して実行されます。これらのオプションは、メソッド固有となり、実行時に変更できます。コンパイラ・コントロールを参照してください。
重要なHotSpot JIT コンパイラ・オプション
次の表では、Oracle JRockitおよびHotSpotの重要なコンパイラ・オプションをいくつか示します。
表4-1 JITコンパイラ・オプション
Oracle JRockit | HotSpot | 注意 |
---|---|---|
|
HotSpotのJITコンパイルは、Oracle JRockitの最適化と類似していると考えられるため(つまり、どちらの方法でも使用されるのは、プロファイルで「hot」と判断されているメソッドのみのため)、HotSpotでOracle JRockitの Oracle JRockitのように、HotSpotもコンパイルからメソッドを除外する方法または特定の最適化を無効化する方法を提供します。 メソッドの最適化で問題が発生した場合、Oracle JRockit VMで 特定メソッドのOracle JRockit JVMに見られるのと同じコンパイルまたは最適化の問題が、HotSpot JVMにも存在することはほとんどありません。そのため、HotSpot JVMに移行する際に、まずこれらのオプションを削除することが最適です。 同等のHotSpot JVMオプションは次のとおりです。
|
特定のメソッドのコンパイルの無効化または遅延に、オプションの |
|
HotSpot JVMには、最適化スレッドはありません。コンパイルおよび最適化の両方を実行するコンパイラ・スレッドの数は次を使用して設定できます。
|
コンパイルに使用するコンパイラ・スレッド数を設定します。デフォルトで、スレッド数はサーバーJVMの場合に2に設定され、階層型コンパイルが使用される場合はコア数まで拡大されます。 |
|
|
JITでコンパイルされたコードの最大コード・キャッシュ・サイズ(バイト単位)を設定します。このオプションは |
なし |
|
階層化コンパイルの使用を有効にします。このオプションは、JDK 8以降はデフォルトで有効化されています。Java HotSpot Server VMのみが、このオプションをサポートしています。 |