エスケープ分析(escape Analysis)


エスケープ分析――コンピュータ言語コンパイラ言語最適化管理において、ポインターダイナミックレンジを分析する方法をエスケープ分析といいます。                   のポインタが複数の方法またはスレッドによって引用されている場合、このポインタはエスケープされたと言われています。
public class G {
	public static B b;
	
	public void globalVariablePointerEscape(){//       ,    
		b=new B();
	}
	
	public B methodPointerEscape(){//     ,    
		return new B();
	}
	
	public void instancePassPointerEscape(){
		methodPointerEscape().printClassName(this);//        
	}
	
	
}

class B{
	public void printClassName(G g){
		System.out.println(g.getClass().getName());
	}
}
この例では、一般的な3つの指針脱出シーンが挙げられます。それぞれは グローバル変数の割り当て、方法は値を返し、インスタンスは転送を参照します。
逃亡分析はJVMの原理を最適化する。
 
javaオブジェクトはスタックに割り当てられていることを知っています。コールスタックにはオブジェクトのポインタだけが保存されています。
オブジェクトが使用されなくなったら、GCによって参照ツリーを巡回し、メモリを回収する必要があります。対象数が多いと、GCに大きな圧力を与え、アプリケーションの性能に間接的に影響を与えます。一時的な対象を減らしてヒープ内で分配する数量、間違いなく最も有効な最適化の方法です。
 
仮対象のヒープ内での配分量をどうやって減らすべきですか?対象を具体化しないわけにはいかないでしょう。
シーン紹介
実は、javaの応用の中で普遍的に1種のシーンが存在します。一般的には方法の中で局所変数が宣言され、この変数は方法の実行ライフサイクル内で逸脱が発生していない(方法の中では参照が外部に露出されていない)。
JVMメモリ割り当てメカニズムにより、まずヒープ内で変数クラスのインスタンスを作成し、次に戻ってきたオブジェクトポインタを呼び出しスタックに押し込んで実行します。
これは最適化前のJVMの処理方式です。
 
逃亡分析の最適化 - スタック上の割り当て
最適化の原理:逃亡していない変数を分析し、変数類の実例メモリを直接スタックに割り当て(スタックに入る必要はない)、割り当てが完了したら、引き続きコールスタック内で実行し、最後のスレッドが終了し、スタック空間が回収され、局部変数オブジェクトも回収される。
 
これは最適化された後の処理方式であり、コントラストは、スタック空間において直接に一時的なオブジェクトとしての記憶媒体とは異なることがわかる。これにより、一時的な対象のヒープ内での割当数が減少しました。
 
脱出分析の原理は簡単ですが、JVMは応用の過程において、多くの考えがあります。
例えば、脱出分析は静的なコンパイルではなく、JITで行われなければなりません。理由は、javaの動態性と衝突したからです。実行中に動的エージェントを通してクラスの行動を変えることができますので、この時点では、エスケープ分析ではクラスの変化を知ることはできません。