JIT または AOT コンパイラーの選択的な無効化

Java™ プログラムの障害が JIT または AOT コンパイラーの問題を示している場合は、問題をさらに絞り込むことができます。

このタスクについて

デフォルトでは、JIT コンパイラーはさまざまな最適化レベルでメソッドを最適化します。 それぞれの呼び出し回数に基づき、各メソッドに異なる最適化が選択されて適用されます。 呼び出し頻度の高いメソッドほど、より高いレベルで最適化されます。 JIT コンパイラーのパラメーターを変更することで、メソッドの最適化レベルを制御できます。 それにより、最適化プログラムが原因であるのか、また、最適化プログラムが原因である場合には、どの最適化に問題があるのかを判別できます。

AOTコンパイラーは、デフォルトでwarm最適化レベルでメソッドをコンパイルします。 AOTコンパイラーにより高いレベルでメソッドを強制的にコンパイルさせることは可能ですが、サポートされていません。

JITパラメーターは、-Xjitオプションに付加されるコンマ区切りリストとして指定します。 構文は、 -Xjit:< param1>,< param2>=< value>です。 以下に例を示します。
java -Xjit:verbose,optLevel=noOpt HelloWorld
この場合は、HelloWorld プログラムが実行され、JIT からの詳細出力が有効にされて、最適化は一切実行せずに JIT にネイティブ・コードを生成させます。 最適化オプションは、 -Xjitにリストされています。 AOT コンパイラーも、-Xaot オプションを使用して同様の方法で制御されます。 JIT コンパイラーの問題を診断する場合は -Xjit オプションを使用し、AOT コンパイラーの問題を診断する場合は -Xaot オプションを使用してください。

コンパイラーのどの部分が障害の原因となっているのかを判別するには、以下のステップに従います。

手順

  1. JIT または AOT パラメーターを設定 count=0 して、コンパイルしきい値をゼロに変更します。 このパラメーターにより、各 Java メソッドは実行前にコンパイルされます。
    count=0は、問題を診断する場合にのみ使用してください。あまり頻繁に使用されないメソッドを含め、より多くのメソッドがコンパイルされるためです。 余分なコンパイルによって、 使用される計算リソースが増えて、アプリケーションの速度が低下します。
    count=0では、問題領域に達するとすぐにアプリケーションが失敗します。 場合によっては、count=1を使用すると、障害をより確実に再現できます。
  2. JIT または AOT コンパイラー・パラメーターに disableInlining を追加します。
    disableInliningは、より大きく複雑なコードの生成を無効にします。
    問題が発生しなくなった場合は、Java サービス・チームがコンパイラーの問題を分析して修正する間に、回避策として disableInlining を使用してください。
  3. optLevel パラメーターを追加して最適化レベルを下げ、障害が発生しなくなるか noOpt レベルに達するまでプログラムを再実行します。 JIT (Just-In-Time) コンパイラーの問題の場合は、scorching から始めて、リストの降順に作業を進めてください。 AOT コンパイラーの問題の場合は、 warm から始めて、リストを下に向かって作業を行います。
    最適化レベルを降順に示すと、以下のとおりになります。
    1. scorching
    2. veryHot
    3. hot
    4. warm
    5. cold
    6. noOpt

次のタスク

これらの設定のいずれかで障害が発生しなくなった場合は、 その回避策を使用できます。 この回避策は、Java サービス・チームがコンパイラーの問題を分析して修正する間の一時的なものです。 JIT または AOT のパラメーター・リストから disableInlining を削除しても障害が再発しない場合には、パフォーマンスを改善するために削除してください。 失敗したメソッドの検索 の指示に従って、回避策のパフォーマンスを向上させます。

それでも障害がnoOpt最適化レベルで発生する場合は、回避策としてJITまたはAOTコンパイラーを使用不可にする必要があります。