棧上分配(逃逸分析)

棧上分配(逃逸分析)

分析

? 逃逸分析的基本行為就是分析對象動態(tài)作用域:當一個對象在方法中被定義后,它可以能被外部方法所引用,例如作為調(diào)用參數(shù)傳遞到其它地方種,稱為方法逃逸。

? 甚至還有可能被外部線程訪問到,譬如賦值給類變量或者可以在其它線程中訪問的實例變量,稱為線程逃逸。

逃逸分析

? 在計算機語言編譯器優(yōu)化原理中,<u>逃逸分析是指分析指針動態(tài)范圍的方法</u>,它同編譯器優(yōu)化原理的指針分析和外形分析相關(guān)聯(lián)。當變量/對象在方法中分配后,其指針有可能被返回或者被全局引用,這樣會被其它過程或者線程所引用,這種現(xiàn)象稱為指針/引用的逃逸(Escape)。

? 通俗的說,如果一個對象的指針被多個方法或者線程引用時,那么我們成這個對象的指針發(fā)生了逃逸。

逃逸的三種狀態(tài)

  1. 全局逃逸:一個對象的引用掏出了方法或者線程。例如:一個對象的引用賦值給一個類變量,或者這個對象的用引用作為方法的返回這返回給了調(diào)用方法。
  2. 參數(shù)級逃逸:方法調(diào)用過程中,傳遞對象給另一個方法
  3. 沒有逃逸:一個可以進行標量替換的對象,可以將這個對象不分配在傳統(tǒng)的堆上

逃逸分析作用

? 通過逃逸分析,java Hotspot 編譯器能夠分析出一個新的對象的引用的使用范圍,從而覺得是否需要將這個對象分配到堆上。

逃逸分析后的優(yōu)化

  1. 棧上分配:一個方法中的對象,若該對象沒有發(fā)生逃逸,則可以將這個對象分配在棧上
  2. 消除同步:線程同步的代價是相當高的,同步帶來的后果是降低了并發(fā)性和程序性能。逃逸分析以判斷某個對象是否始終只被一個線程訪問,如果只被一個線程訪問,那么該對象的同步操作就可以轉(zhuǎn)化為沒有同步的操作,這樣可以大大提高并發(fā)性能
  3. 標量替換:java虛擬機中的原始數(shù)據(jù)類型(int,long等)都不能在進一步分解,他們就可以成為標量。相對的,如果一個數(shù)據(jù)可以繼續(xù)分解,那么他成為聚合量,java中最典型的聚合量就是對象。如果逃逸分析證明一個對象不會被外部訪問,并且這個這個對象是可以分解的,那么程序真正執(zhí)行的時候可能不創(chuàng)建這個對象,而改為直接創(chuàng)建它的若干個被這個方法能夠使用到的成員變量來代替。拆散后的變量便可以被單獨的分析與優(yōu)化,可以分別分配在棧幀或者寄存器上,原來的對象就不需要整體被分配在堆中。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容