web-dev-qa-db-ja.com

-XX:-TieredCompilationは正確に何をしますか?

Java -XX:+PrintFlagsFinalを使用して、TieredCompilationフラグを見つけました。それについて少しオンラインで読みました。

ただし、falseに設定するとどうなるか正確にわかりません。

コンパイルシステムは、基本的にインタープリター、C1およびC2に分割された5つの実行レベルをサポートしていることを知っています。

  • レベル0-通訳
  • レベル1-完全に最適化されたC1(プロファイリングなし)
  • レベル2-呼び出しカウンターとバックエッジカウンターを備えたC1
  • レベル3-完全なプロファイリングを伴うC1(レベル2 + MDO)
  • レベル4-C2

ソース: http://hg.openjdk.Java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

2つの質問:

(1)-XX:-TieredCompilationを設定すると、これらのレベルの一部は無効になりますか?はいの場合、どれですか?

(2)C1またはC2を無効にするか、まったくコンパイルしないかを決定するフラグがありますか?

52
Markus Weninger

-XX:-TieredCompilationは、中間コンパイル層(1、2、3)を無効にし、メソッドが最大最適化レベル(C2)で解釈またはコンパイルされるようにします。

副作用として、TieredCompilationフラグは、コンパイラスレッドの数、コンパイルポリシー、およびデフォルトのコードキャッシュサイズも変更します。 TieredCompilationが無効になっていることに注意してください

  • コンパイラスレッドが少なくなります。
  • 高度なコンパイルポリシー ;の代わりに、単純なコンパイルポリシー(メソッド呼び出しとバックエッジカウンターに基づく)が選択されます。
  • デフォルトの予約コードキャッシュサイズは 5倍小さい です。

C2コンパイラを無効にし、C1のみを追加のオーバーヘッドなしで残すには、-XX:TieredStopAtLevel=1を設定します。

すべてのJITコンパイラを無効にし、インタープリターですべてを実行するには、-Xintを使用します。

56
apangin

お気付きのとおり、JITにはさまざまなレベルがあります(JITをまったく実行しないことを含む)。

以前のバージョンのJavaでは、最初にそれらを選択する必要がありました(たとえば_-Xint_、_-client_、_-server_)。クライアント(C1)コンパイラーだけでインタープリターだけで実行します。または単にサーバー(C2)コンパイラー。

Java 7で提供された階層型コンパイルは、ホットスポットコンパイラがこれらのステップ間をシームレスに移行できることを意味しました。そのため、一定量の実行後、コードはC1でコンパイルされ、さらに実行後、コードはC2でコンパイルされます。これはメソッドごとに行われるため、アプリが実行されている場合、かなりの部分がインタープリター(コールドコード用)で実行され、コードが大量に実行された後(ホット)にコンパイルされます。よりパフォーマンスが向上します。を実行すると、さまざまなレベルを確認できます

_$ Java -XX:+PrintFlagsFinal -version | grep CompileThreshold
intx Tier2CompileThreshold                     = 0
intx Tier3CompileThreshold                     = 2000
intx Tier4CompileThreshold                     = 15000
openjdk version "1.8.0_92"
OpenJDK Runtime Environment (Zulu 8.15.0.1-macosx) (build 1.8.0_92-b15)
OpenJDK 64-Bit Server VM (Zulu 8.15.0.1-macosx) (build 25.92-b15, mixed mode)
_

_-XX:-TieredCompilation_は本質的に_TieredCompilation=false_であり、これはこの移行を行わないことを意味し、クライアントコンパイラを使用するかサーバーコンパイラを使用するかを事前に選択する必要があります。 JVMは、CPUに基づいて適用するモードをヒューリスティックに決定します。複数のプロセッサまたは64ビットVMがある場合、サーバーVM(C2)を使用します。それ以外の場合、クライアントVM(C1)を使用します。

したがって、_-Xint_はインタープリターのみで実行され(コンパイラーなし)、_-client_とともに、それぞれ_-server_または_-XX:-TieredCompilation_でC1またはC2のみを選択できます

15
AlBlue

Java 8ユーザーであるため、浮動小数点での実稼働使用のためにTieredComplilationを無効にすることをお勧めします。

Oracleは、Java8でこの問題を修正しません。 G1GCを備えたすべてのホットスポットJVM 8にも同じ問題があります。

Bug1 )( Bug2

3
WENPIN1