Java仮想マシン(7)---解釈器とJITコンパイラを見て
2667 ワード
Javaは解釈言語として定められており、JITコンパイラは強制的に必要とされるものではなく、すべての仮想マシンが解釈器+コンパイラを用いた並存アーキテクチャであるわけではありません.しかし、Hotspot、J 9などの主流の商用仮想マシンでは、このような並存アーキテクチャが採用されています.
インタプリタとコンパイラの比較
解釈器の利点:コンパイル時間を省き、起動速度が速いコンパイラの利点:コードを最適化し、実行効率が高い2つの方法の利点はそれぞれ相手の欠点である.すなわち,解釈器の欠点は実行効率が低下し,コンパイラの欠点は起動速度が遅いことである.分かりやすいです.
Java仮想マシン
Java仮想マシンのプラットフォームは無関係で、Cコンパイラよりバイトコードのステップが1つ増えているため、パフォーマンス効率が向上しています.だからJava仮想マシンはこのような解釈器とコンパイラ(client(c 1とも呼ばれる)モードとserver(c 2)モード)が共存する方式を採用して、速度と効率に対してtrade offをしました.簡単に言えば、Java仮想マシンは使用頻度の高い「ホットスポットコード」を、インスタントコンパイラに起動してローカルコードにコンパイルし、後で使用するたびにローカルコードを直接呼び出すことです.では、質問が来ました.ホットスポットコード の判定方法判定後の処理方法 ホットスポットコードの判定
現在、主に2つの方法でホットスポットコードを検出する:1.サンプリングに基づくホットスポット検出:仮想マシンが各スレッドを周期的に検出するスタックトップ方法、ある方法がよく現れると、この方法はホットスポットコードであると判定する.利点:実現が簡単;欠点:スレッドがスレッドでブロックされている場合など、正確ではありません.ホットスポット検出が乱れます.2.カウンタベースのホットスポット検出:メソッドごとにカウンタを設定し、実行回数を統計し、一定しきい値(yu)を超えると「ホットスポットメソッド」とみなされる.利点:正確;欠点:複雑な実装で、各メソッドにカウンタを維持します.
ホットスポットコードの処理
カウンタのプローブに基づいて、各メソッドに2つのカウンタを用意します.メソッド呼び出しカウンタとエッジバックカウンタです.どちらのカウンタにもそれぞれ1つの閾値があり、閾値を超えるとJITコンパイルがトリガーされます.メソッド呼び出しカウンタ:このメソッドが呼び出された回数を統計するために使用され、c 1モードではデフォルト5000回、c 2モードでは10000回である.実行プロセスは、コンパイルバージョンが存在するかどうかを判断し、存在する場合はコンパイルバージョンを実行します.そうでなければ、メソッドカウンタ+1は、2つのカウンタの和(注意:メソッドカウンタとエッジカウンタの和)がメソッドカウンタ閾値を超えたか否かを判断し、超えた場合はコンパイラにコンパイル要求を提出し、閾値を超えない場合の処理と同様に、このメソッドを実行するように解釈する.PS:このカウンタは絶対回数ではなく、相対的な実行回数、すなわち一定時間内の実行回数であり、一定の時間限度を超えても閾値に達していない場合、そのカウンタは半分減少し、この過程を熱減衰と呼ぶ. エッジバックカウンタ:メソッド内の循環体コードの実行回数を統計するために使用され、バイトコードで制御流向後ジャンプに遭遇した命令を「エッジバック」と呼ぶ.このカウンタを確立する目的は、OSR(On StackReplacement)コンパイル、すなわちスタック上の置換をトリガすることである.メソッドカウンタ実行プロセスとは異なり、2つのカウンタの和がしきい値を超えると、コンパイラにOSRコンパイルをコミットし、エッジカウンタ値を調整しても解釈で実行されます.PS:このカウンタは絶対回数で、熱減衰はありません.
その他のコンパイル最適化テクノロジー共通サブエクスプレッション消去: に相当する.
計算を1回省く.2.配列境界チェック消去例えば、前のコードでf[3]を使用し、0<=3<=f.lengthと判断した場合、次回f[3]を使用する場合、判断は省略することができる.3.方法内連:虚でない方法については話さない.Javaのダミーメソッドでは、メソッドのインラインに問題が発生し、どのバージョンの実装を選択するかが問題であり、Java仮想マシンは「タイプ継承関係分析」(Class Hierarchy Analysis,CHA)という技術を導入している.このメソッドは、複数のバージョンの実装を検出する際に、インラインキャッシュを使用します.すなわち、最初の呼び出しが発生したときに、受信者情報を記録し、メソッドをキャッシュします.次に呼び出しが発生したときに、受信者情報を比較します.同じように、キャッシュ内のメソッドを使用します.そうしないと、インラインバッファをキャンセルします.4.逃走分析:オブジェクトのダイナミックな役割ドメインを分析し、オブジェクトがメソッドで定義されると、外部メソッドに呼び出される可能性があります.この動作をメソッド逃走と呼びます.外部スレッドにアクセスされる可能性もあり、この動作をスレッド脱出と呼ぶ.オブジェクトがメソッド逃走やスレッド逃走を起こさないことを保証できれば、スタック上の割り当て、同期消去、スカラー置換など、この変数をいくつかの大学で最適化することができます.
インタプリタとコンパイラの比較
解釈器の利点:コンパイル時間を省き、起動速度が速いコンパイラの利点:コードを最適化し、実行効率が高い2つの方法の利点はそれぞれ相手の欠点である.すなわち,解釈器の欠点は実行効率が低下し,コンパイラの欠点は起動速度が遅いことである.分かりやすいです.
Java仮想マシン
Java仮想マシンのプラットフォームは無関係で、Cコンパイラよりバイトコードのステップが1つ増えているため、パフォーマンス効率が向上しています.だからJava仮想マシンはこのような解釈器とコンパイラ(client(c 1とも呼ばれる)モードとserver(c 2)モード)が共存する方式を採用して、速度と効率に対してtrade offをしました.簡単に言えば、Java仮想マシンは使用頻度の高い「ホットスポットコード」を、インスタントコンパイラに起動してローカルコードにコンパイルし、後で使用するたびにローカルコードを直接呼び出すことです.では、質問が来ました.
現在、主に2つの方法でホットスポットコードを検出する:1.サンプリングに基づくホットスポット検出:仮想マシンが各スレッドを周期的に検出するスタックトップ方法、ある方法がよく現れると、この方法はホットスポットコードであると判定する.利点:実現が簡単;欠点:スレッドがスレッドでブロックされている場合など、正確ではありません.ホットスポット検出が乱れます.2.カウンタベースのホットスポット検出:メソッドごとにカウンタを設定し、実行回数を統計し、一定しきい値(yu)を超えると「ホットスポットメソッド」とみなされる.利点:正確;欠点:複雑な実装で、各メソッドにカウンタを維持します.
ホットスポットコードの処理
カウンタのプローブに基づいて、各メソッドに2つのカウンタを用意します.メソッド呼び出しカウンタとエッジバックカウンタです.どちらのカウンタにもそれぞれ1つの閾値があり、閾値を超えるとJITコンパイルがトリガーされます.
その他のコンパイル最適化テクノロジー
int d = (c * b) * 12 +(a + b * c)
が最適化されていない場合、b*cは2回計算され、最適化後は:E = c * b;
int d = E * 12 + (a + E);
計算を1回省く.2.配列境界チェック消去例えば、前のコードでf[3]を使用し、0<=3<=f.lengthと判断した場合、次回f[3]を使用する場合、判断は省略することができる.3.方法内連:虚でない方法については話さない.Javaのダミーメソッドでは、メソッドのインラインに問題が発生し、どのバージョンの実装を選択するかが問題であり、Java仮想マシンは「タイプ継承関係分析」(Class Hierarchy Analysis,CHA)という技術を導入している.このメソッドは、複数のバージョンの実装を検出する際に、インラインキャッシュを使用します.すなわち、最初の呼び出しが発生したときに、受信者情報を記録し、メソッドをキャッシュします.次に呼び出しが発生したときに、受信者情報を比較します.同じように、キャッシュ内のメソッドを使用します.そうしないと、インラインバッファをキャンセルします.4.逃走分析:オブジェクトのダイナミックな役割ドメインを分析し、オブジェクトがメソッドで定義されると、外部メソッドに呼び出される可能性があります.この動作をメソッド逃走と呼びます.外部スレッドにアクセスされる可能性もあり、この動作をスレッド脱出と呼ぶ.オブジェクトがメソッド逃走やスレッド逃走を起こさないことを保証できれば、スタック上の割り当て、同期消去、スカラー置換など、この変数をいくつかの大学で最適化することができます.