プライマリ・コンテンツに移動
Java Platform, Standard Edition JRockitからHotSpotへの移行ガイド
リリース9
E90925-02
目次へ移動
目次

前
前へ
次

4 コンパイル最適化

このトピックでは、コンパイルを最適化するためにOracle JRockitおよびHotSpotで使用可能な様々なコンパイラ・オプションを説明します。

コンパイラ考慮事項

Oracle JRockitとは異なり、HotSpotには2つの異なるJust In Time (JIT)コンパイラ(クライアント(C1とも呼ぶ)およびサーバー(C2とも呼ぶ))に加え、Javaバイト・コード・インタプリタの特徴があります。

この項では、使用可能なコンパイラについて詳しく説明します。

HotSpot VMはデフォルトでJavaバイト・コードを解析します。これは、実行時プロファイリングが「hot」と判断するメソッド(事前に定義された回数分実行されるメソッド)をコンパイル(JITコンパイル)します。JITコンパイラは、クライアントまたはサーバー・コンパイラです。

  • クライアント・コンパイラ: メソッドをすばやくコンパイルしますが、サーバー・コンパイラほどは最適化されないマシン・コードを生成します。このコンパイラを使用すると、迅速に起動します。また、このコンパイラでは、少ないメモリー・フットプリントが定常パフォーマンスより重要です。

  • サーバー・コンパイラ: このコンパイラは、同じメソッドのコンパイルにより多くの時間がかかります(およびより多くのメモリーを消費します)。ただし、クライアント・コンパイラで生成したコードより最適化されたマシン・コードを生成します。アプリケーションが定常に達した後は、実行時パフォーマンスが向上します。

階層型コンパイルは、クライアント・コンパイラを1番目の階層として使用することで、クライアントVMの起動速度と同じサーバーのVM速度を高速化します。サーバーVMは、インタプリタを使用してコンパイラに渡されるメソッドについてのプロファイリング情報を収集します。階層型方式では、インタプリタに加えてクライアント・コンパイラはメソッドのコンパイル・バージョンを生成し、それらが自身のプロファイリング情報を収集します。コンパイルされたコードはインタプリタよりもはるかに高速なため、このプロファイリング段階の実行パフォーマンスが大きく向上します。サーバー・コンパイラによって生成される最終コードをアプリケーション初期化の早い段階で利用できる可能性があるため、多くの場合クライアントVMでの起動速度を向上させることができます。階層型スキームは、通常のサーバーVMより優れたピーク・パフォーマンスを実現する可能性もあります。これは、プロファイリング段階が高速化することでプロファイリングにかけられる時間が長くなるため、最適化の向上につながるためです。

階層型コンパイルはサーバーVMのデフォルト・モードです。64ビット・モードがサポートされています。階層型コンパイルを手動で有効化するには、-XX:+TieredCompilationフラグを使用します。-XX:-TieredCompilationフラグを使用すると、階層型コンパイルを無効化できます。

Oracle JRockit JVMはJavaメソッドをコンパイルし、最初に起動されたときにJavaメソッドのマシン・コードを生成します。この頻繁に起動されるメソッドのコンパイルされたコードは、オプティマイザ・スレッドによってバックグラウンドで最適化されます。このコードは、メソッドが最初に解析され、後にクライアント・コンパイラ(最適化が少ない)またはサーバー・コンパイラ(最適化が多い)によってコンパイルされるHotSpotとは完全に異なります。

重要なHotSpot JIT コンパイラ・オプション

次の表では、Oracle JRockitおよびHotSpotの重要なコンパイラ・オプションをいくつか示します。

表4-1 JITコンパイラ・オプション

Oracle JRockit HotSpot 注意

-XnoOpt

-XXoptFile:<file>

HotSpotのJITコンパイルは、Oracle JRockitの最適化と類似していると考えられるため(つまり、どちらの方法でも使用されるのは、プロファイルで「hot」と判断されているメソッドのみのため)、HotSpotでOracle JRockitの-XnoOptと同等のオプションは-Xintです。この技術ではJITコンパイルはまったく実行されず、バイト・コード・インタプリタのみがすべてのメソッドを実行するために使用されます。このコンパイルは、パフォーマンスに影響を与える可能性があります。ただし、-XnoOptをトラブルシューティングおよびOracle JRockitのコンパイラの想定される問題への対処に使用する場合に役立つことがあります。

Oracle JRockitのように、HotSpotもコンパイルからメソッドを除外する方法または特定の最適化を無効化する方法を提供します。

メソッドの最適化で問題が発生した場合、Oracle JRockit VMでXnoOptまたはXXoptFile オプションを使用して、これらのメソッドの最適化を無効化します。ただし、コンパイルを除外するか、これらのメソッドで特定の最適化を無効化する場合、直接、HotSpotオプションに変換しないでください。

特定メソッドのOracle JRockit JVMに見られるのと同じコンパイルまたは最適化の問題が、HotSpot JVMにも存在することはほとんどありません。そのため、HotSpot JVMに移行する際に、まずこれらのオプションを削除することが最適です。

同等のHotSpot JVMオプションは次のとおりです。

  • -XX:CompileCommand=command,method[,option]

    メソッドで実行するコマンドを指定します。たとえば、Stringクラスの indexOf()メソッドをコンパイルから除外するには、次を使用します。

    -XX:CompileCommand=exclude,java/lang/String.indexOf

  • -XX:CompileCommandFile=<filename>

    JITコンパイラ・コマンドが読み取られるファイルを設定します。デフォルトで、.hotspot_compilerファイルは、JITコンパイラによって実行されるコマンドを格納するために使用されます。

  • -XX:CompileOnly=<methods>

    コンパイルを制限する必要があるメソッドのリスト(カンマ区切り)を設定します。

  • -XX:CompileThreshold=<invocations>

    コンパイル前に解析対象メソッドの呼出しの数を設定します。デフォルトで、サーバーJVMでは、JITコンパイラは10,000回の解析対象メソッドの呼出しを実行して、効率的なコンパイルのための情報を収集します。クライアントJVMの場合、デフォルトの設定は1,500回の呼出しです。

特定のメソッドのコンパイルの無効化または遅延に、オプションのCompileCommandCompileCommandFileCompileOnlyおよびCompileThresholdを使用できます。

-XX:OptThreads

HotSpot JVMには、最適化スレッドはありません。コンパイルおよび最適化の両方を実行するコンパイラ・スレッドの数は次を使用して設定できます。

-XX:CICompilerCount=<threads>

コンパイルに使用するコンパイラ・スレッド数を設定します。デフォルトで、スレッド数はサーバーJVMの場合に2に設定され、クライアントJVMの場合に1に設定され、階層型コンパイルが使用される場合はコア数まで拡大されます。

-XX:+ReserveCodeMemory

-XX:MaxCodeMemory=<size>

-XX:ReservedCodeCacheSize=<size>

JITでコンパイルされたコードの最大コード・キャッシュ・サイズ(バイト単位)を設定します。このオプションは -Xmaxjitcodesizeと同等です。

なし

-XX:+TieredCompilation

階層化コンパイルの使用を有効にします。このオプションは、JDK 8以降はデフォルトで有効化されています。Java HotSpot Server VMのみが、このオプションをサポートしています。