Java -XX:+PrintFlagsFinal
を使用して、TieredCompilation
フラグを見つけました。それについて少しオンラインで読みました。
ただし、false
に設定するとどうなるか正確にわかりません。
コンパイルシステムは、基本的にインタープリター、C1およびC2に分割された5つの実行レベルをサポートしていることを知っています。
2つの質問:
(1)-XX:-TieredCompilation
を設定すると、これらのレベルの一部は無効になりますか?はいの場合、どれですか?
(2)C1またはC2を無効にするか、まったくコンパイルしないかを決定するフラグがありますか?
-XX:-TieredCompilation
は、中間コンパイル層(1、2、3)を無効にし、メソッドが最大最適化レベル(C2)で解釈またはコンパイルされるようにします。
副作用として、TieredCompilation
フラグは、コンパイラスレッドの数、コンパイルポリシー、およびデフォルトのコードキャッシュサイズも変更します。 TieredCompilation
が無効になっていることに注意してください
C2コンパイラを無効にし、C1のみを追加のオーバーヘッドなしで残すには、-XX:TieredStopAtLevel=1
を設定します。
すべてのJITコンパイラを無効にし、インタープリターですべてを実行するには、-Xint
を使用します。
お気付きのとおり、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のみを選択できます