JVM的逃逸分析詳解

        即時編譯(Just In Time,簡稱JIT)是一種通過在運行時將字節碼翻譯成機器碼,從而改善字節碼編譯語言性能技術。逃逸分析並不是直接的優化手段,而是一個代碼分析,通過動態分析對象的作用域,爲其他優化手段,如同步消除、棧上分配和標量替換等提供依據。

        發生逃逸行爲的情況有兩種:方法逃逸和線程逃逸;

        方法逃逸:當一個對象在方法中第一之後,作爲參數傳遞到其他方法中。

        線程逃逸:如類變量或者實例變量,可能被其他線程訪問到。

        如果沒有發生逃逸,JVM就會對代碼進行優化。優化方法:

        1、同步消除:

         線程同步本身比較消耗性能,如果確定一個對象不會逃逸出線程,無法被其他線程訪問到,該對象的讀寫就不存在競爭,因此可以消除該對象的同步鎖。

        2、標量替換:

        標量是指不可分割的量,如java中的基本數據類型和引用類型;相對的一個數據可以繼續分解,稱爲聚合量。把一個對象拆散,將其成員變量恢復到基本類型來訪問就叫做標量替換。如果逃逸分析發現一個對象不會被外部訪問,並且該對象可以被拆散,那麼經過優化後,並不直接生成改對象,而是在棧上創建若干個成員變量。

        3、棧上分配:

        顧名思義,即是棧上分配對象。一般情況下,對象是在堆中分配的,沒有發送方法逃逸的對象,在棧上分配的效率更高。執行完畢後,釋放棧的資源,對象被銷燬,就不用等到垃圾回收。真正的實現策略:並不會在棧上創建對象,而是利用了標量替換的原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章