java中jvm脱走問題の分析
引用:エスケープ分析(Escape Analysis)は多くのJVM技術の中の一つで、多くない技術点を使用しています。本論文では、その使用シーンを一例で分析します。
概念
エスケープ解析は、Javaプログラムにおける同期負荷とメモリスタック割り当て圧力を効果的に減らすことができる関数的大域データストリーム解析アルゴリズムである。逸脱解析により、Java Hotspotコンパイラは、新しいオブジェクトの参照の使用範囲を分析して、このオブジェクトをヒープに割り当てるかどうかを決定することができます。
コンピュータ言語コンパイラの最適化原理において、逸脱解析は、コンパイラの最適化原理の指針分析と外形分析と関連している指針のダイナミックレンジを分析する方法を指す。変数(またはオブジェクト)が方法に割り当てられた後、そのポインタが戻ったり、大域的に参照されたりする可能性があり、他のプロセスまたはスレッドによって参照される。このような現象は、ポインタ(または参照)のエスケープ(Escape)と呼ばれる。
Javaは、java SE 6 u 23および以降のバージョンでサポートされ、デフォルトでエスケープ分析のオプションを開きました。JavaのHotSpot JITコンパイラは、方法でコードをリロードしたり、動的にコードをロードしたりする際に、コードを逸脱分析することができます。また、Javaオブジェクトはヒープ上にスレッドを配置し、内蔵スレッドの特徴により、逸脱をJavaの重要な機能として分析することができます。
上の文は他の人の話を引用して、専門用語をたくさん使っています。まとめてみます。
脱出分析によって、いくつかのインスタンスまたは変数がヒープ内で割り当てられるかどうかを決定し、もし脱出分析がオンになれば、これらの変数をスタック上で直接に割り当てることができ、ヒープ上ではなく分配することができる。これらの変数のポインタは、大域的に参照されるか、または他のスレッドに参照されることができる。
オープン設定
デフォルトはJDK 6 u 23以上でデフォルトオープンです。ここで設定をもう一度明確にします。
強制オープン
コード:
ここで画像の説明を書きます。
逸脱解析の運転結果が開けられていません。
ここで画像の説明を書きます。
分析してみます。ここでは2バイトのデータを1千万回ずつ循環し、脱出を開始する運行時間は8 mimicrecondで、未オープンは956で、未オープンの約1/120.
違いはやはり非常にはっきりしています。
締め括りをつける
スタック上の空間は一般的に非常に小さいです。いくつかの変化と小さいデータ構造しか保存できません。大容量の記憶構造はできません。ここでの例は極端な千万二次の循環であり、脱出分析によって直接にスタックから割り当てられ、GCの回数を大幅に低減し、プログラム全体の実行効率を向上させた。
したがって、脱出分析の効果は、特定のシーンにおいてのみ、高周波数と高容量の比較的小さな変数割り当て構造を満たすことができる。
概念
エスケープ解析は、Javaプログラムにおける同期負荷とメモリスタック割り当て圧力を効果的に減らすことができる関数的大域データストリーム解析アルゴリズムである。逸脱解析により、Java Hotspotコンパイラは、新しいオブジェクトの参照の使用範囲を分析して、このオブジェクトをヒープに割り当てるかどうかを決定することができます。
コンピュータ言語コンパイラの最適化原理において、逸脱解析は、コンパイラの最適化原理の指針分析と外形分析と関連している指針のダイナミックレンジを分析する方法を指す。変数(またはオブジェクト)が方法に割り当てられた後、そのポインタが戻ったり、大域的に参照されたりする可能性があり、他のプロセスまたはスレッドによって参照される。このような現象は、ポインタ(または参照)のエスケープ(Escape)と呼ばれる。
Javaは、java SE 6 u 23および以降のバージョンでサポートされ、デフォルトでエスケープ分析のオプションを開きました。JavaのHotSpot JITコンパイラは、方法でコードをリロードしたり、動的にコードをロードしたりする際に、コードを逸脱分析することができます。また、Javaオブジェクトはヒープ上にスレッドを配置し、内蔵スレッドの特徴により、逸脱をJavaの重要な機能として分析することができます。
上の文は他の人の話を引用して、専門用語をたくさん使っています。まとめてみます。
脱出分析によって、いくつかのインスタンスまたは変数がヒープ内で割り当てられるかどうかを決定し、もし脱出分析がオンになれば、これらの変数をスタック上で直接に割り当てることができ、ヒープ上ではなく分配することができる。これらの変数のポインタは、大域的に参照されるか、または他のスレッドに参照されることができる。
オープン設定
デフォルトはJDK 6 u 23以上でデフォルトオープンです。ここで設定をもう一度明確にします。
強制オープン
-server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
逃亡分析を閉鎖する
-server -XX:-DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
インスタンス検証コード:
public class OnStackTest {
public static void alloc() {
byte[] b = new byte[2];
b[0] = 1;
}
public static void main(String[] args) {
long b = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
alloc();
}
long e = System.currentTimeMillis();
System.out.println(e - b);
}
}
逃避の運転結果を開く:ここで画像の説明を書きます。
逸脱解析の運転結果が開けられていません。
ここで画像の説明を書きます。
分析してみます。ここでは2バイトのデータを1千万回ずつ循環し、脱出を開始する運行時間は8 mimicrecondで、未オープンは956で、未オープンの約1/120.
違いはやはり非常にはっきりしています。
締め括りをつける
スタック上の空間は一般的に非常に小さいです。いくつかの変化と小さいデータ構造しか保存できません。大容量の記憶構造はできません。ここでの例は極端な千万二次の循環であり、脱出分析によって直接にスタックから割り当てられ、GCの回数を大幅に低減し、プログラム全体の実行効率を向上させた。
したがって、脱出分析の効果は、特定のシーンにおいてのみ、高周波数と高容量の比較的小さな変数割り当て構造を満たすことができる。