はじめに:エスケープ分析は、多くのJVMテクノロジーでは使用されていない技術的なポイントです。この記事では、例を使用して使用シナリオを分析します。
Escape Analysisは、Javaプログラムの同期負荷とメモリヒープの割り当て圧力を効果的に減らすことができる、官能的なグローバルデータフロー分析アルゴリズムです。エスケープ分析により、Java Hotspotコンパイラは、新しいオブジェクトの参照の使用範囲を分析し、オブジェクトをヒープに割り当てるかどうかを決定できます。
コンピューター言語コンパイラの最適化の原則では、エスケープ分析とは、ポインターのダイナミックレンジのポインターを分析する方法を指します。これは、ポインター分析とコンパイラ最適化原理の外観分析に関連しています。変数(またはオブジェクト)がメソッドに割り当てられると、そのポインターはグローバルに返されるか、参照される場合があります。これは、他のプロセスまたはスレッドによって参照されます。この現象は、ポインターの脱出(または参照)と呼ばれます。
Javaは、Java SE 6U23以降のバージョンで脱出分析オプションをサポートおよび有効にします。 JavaのHotspot JITコンパイラは、メソッドが過負荷または動的にロードされたときに、コード上でエスケープ分析を実行できます。同時に、ヒープと組み込みのスレッドに割り当てるJavaオブジェクトの特性により、エスケープ分析はJavaの重要な機能になります。
上記の段落は、私が他の誰かから引用した一節です。この記事では、多くの専門用語を使用しています。その意味を要約させてください:
エスケープ分析は、特定のインスタンスまたは変数がヒープに割り当てられているかどうかを判断するために使用されます。エスケープ分析が有効になっている場合、これらの変数はヒープではなくスタックに直接割り当てることができます。これらの変数へのポインターは、グローバルに参照することも、他のスレッドで参照することもできます。
設定をオンにします
デフォルトはJDK 6U23以上で有効になります。ここでは、設定を再定義します。
開くことを余儀なくされました
-server -xx:+doscapeanalysis -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); }}エスケープ操作の結果をオンにします:
ここに写真の説明を書いてください
エスケープ分析の実行結果が有効になっていない:
ここに写真の説明を書いてください
分析するために、ここでは1,000万回の2バイトのデータサイクルを割り当てるために、Activate Escapeの実行時間は8ミリ秒ですが、Unactivatedは956です。
違いの効果はまだ非常に明白です...
スタック上のスペースは一般的に非常に小さく、いくつかの変更と小さなデータ構造のみを保存することができ、大容量のストレージ構造は実現できません。ここでの例は、極端な数千万回で、脱出分析を強調し、スタックから直接割り当てることができ、GCSの数を大幅に削減し、プログラムの全体的な実行効率を向上させます。
したがって、エスケープ分析の効果は、特定のシナリオでのみ有効になります。特定のシナリオは、高頻度と高い数の比較的少ない容量の可変割り当て構造を満たしています。