コンパイラでの脱出分析

2611 ワード

エスケープ分析
コンピュータ言語コンパイラ言語最適化管理では,ポインタの動的範囲を解析する方法を逃走解析と呼ぶ.
一般的には、1つのオブジェクトのポインタが複数のメソッドまたはスレッドによって参照されると、このポインタが逃走したと呼ばれます.
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アプリケーションには一般的にシーンが存在します.一般に、メソッド内でローカル変数が宣言され、メソッドの実行ライフサイクル中に脱出は発生しません(メソッド内では、参照は外部に露出されません).JVMメモリ割り当てメカニズムに従って、まずスタックに変数クラスのインスタンスを作成し、返されたオブジェクトポインタを呼び出しスタックに押し込み、実行を続行します.
これは最適化前のJVMの処理方法です.
エスケープ分析最適化-スタック上の割り当て
最適化原理:分析は逃げていない変数を見つけ、変数クラスのインスタンス化メモリを直接スタックに割り当て(スタックに入る必要はありません)、割り当てが完了した後、呼び出しスタック内で実行を続け、最後にスレッドが終了し、スタック空間が回収され、局所変数オブジェクトも回収されます.
これは最適化された処理方式であり,比較から,スタック空間で直接一時的なオブジェクトとしての記憶媒体の違いが主であることがわかる.これにより、スタック内の一時オブジェクトの割り当て数が減少します.
逃走分析の原理は簡単であるが,JVMの応用過程には多くの考慮がある.
例えば,逃走解析は静的コンパイル時に行うことができず,JITで完了しなければならない.なぜならjavaのダイナミック性と競合しているからです.実行時に動的エージェントによってクラスの動作を変更できるため、逃走分析ではクラスが変化したことはわかりません.
逃走分析は直接の最適化手段ではなく、コード分析であり、動的分析対象の役割ドメインを通じて、スタック上の割り当て、スカラー置換、同期除去などの他の最適化手段に根拠を提供し、逃走行為が発生する場合は2つある:方法逃走とスレッド逃走.
1、方法逃走:一つのオブジェクトが方法で定義された後、パラメータとして他の方法に伝達する;2、スレッド逃走:クラス変数やインスタンス変数など、他のスレッドにアクセスされる可能性がある.
逃走動作が存在しない場合は、同期消去、スカラー置換、スタック上の割り当てなど、オブジェクトを最適化できます.
同期消去
スレッド同期自体が消費され、オブジェクトがスレッドから逃げず、他のスレッドにアクセスできないと判断した場合、そのオブジェクトの読み書きに競合は存在しません.このオブジェクトに対する同期ロックは解消され、-XX:+EliminateLocksによって同期消去が開始されます.
スカラー置換
1、スカラーとはjavaの基本データ型やreference型のような分割できない量を指し、相対的なデータは集約量と呼ばれる分解を続けることができる.2、オブジェクトを分割し、メンバー変数を基本タイプに復元してアクセスすることをスカラー置換と呼ぶ.3.逃走分析により、1つのオブジェクトが外部にアクセスされず、そのオブジェクトが解体されることが分かった場合、最適化された後、そのオブジェクトを直接生成するのではなく、スタック上に複数のメンバー変数を作成する.-X:+EliminateAllocationsでスカラー置換をオンにし、-X:+PrintEliminateAllocationsでスカラー置換を表示します.
スタック上の割当て
したがって,スタックにオブジェクトを割り当てることが議論されているが,実際にはHotspotは本当の意味でのスタック上の割り当てを実現しておらず,実際にはスカラー置換である.
作者:占小狼リンク:http://www.jianshu.com/p/20bd2e9b1f03出典:簡書の著作権は作者の所有である.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.