HotSpot JIT和逃逸分析

 

JIT

即時編譯(Just-in-time Compilation,JIT)是一種經過在運行時將字節碼翻譯爲機器碼,從而改善字節碼編譯語言性能的技術。在HotSpot實現中有多種選擇:C一、C2和C1+C2,分別對應client、server和分層編譯。
一、C1編譯速度快,優化方式比較保守;
二、C2編譯速度慢,優化方式比較激進;
三、C1+C2在開始階段採用C1編譯,當代碼運行到必定熱度以後採用G2從新編譯;
在1.8以前,分層編譯默認是關閉的,能夠添加-server -XX:+TieredCompilation參數進行開啓。java

 

逃逸分析

逃逸分析並非直接的優化手段,而是一個代碼分析,經過動態分析對象的做用域,爲其它優化手段如棧上分配、標量替換和同步消除等提供依據,發生逃逸行爲的狀況有兩種:方法逃逸和線程逃逸。
一、方法逃逸:當一個對象在方法中定義以後,做爲參數傳遞到其它方法中;
二、線程逃逸:如類變量或實例變量,可能被其它線程訪問到;性能

若是不存在逃逸行爲,則能夠對該對象進行以下優化:同步消除、標量替換和棧上分配。優化

同步消除

線程同步自己比較耗,若是肯定一個對象不會逃逸出線程,沒法被其它線程訪問到,那該對象的讀寫就不會存在競爭,則能夠消除對該對象的同步鎖,經過-XX:+EliminateLocks能夠開啓同步消除。線程

標量替換

一、標量是指不可分割的量,如java中基本數據類型和reference類型,相對的一個數據能夠繼續分解,稱爲聚合量;
二、若是把一個對象拆散,將其成員變量恢復到基本類型來訪問就叫作標量替換;
三、若是逃逸分析發現一個對象不會被外部訪問,而且該對象能夠被拆散,那麼通過優化以後,並不直接生成該對象,而是在棧上建立若干個成員變量;
經過-XX:+EliminateAllocations能夠開啓標量替換, -XX:+PrintEliminateAllocations查看標量替換狀況。翻譯

棧上分配

故名思議就是在棧上分配對象,其實目前Hotspot並無實現真正意義上的棧上分配,其實是標量替換。code

原做者:佔小狼 連接:https://www.jianshu.com/p/20bd2e9b1f03 來源:簡書
相關文章
相關標籤/搜索