AOT,JIT是什麼?
JIT,即Just-in-time,動態(即時)編譯,邊運行邊編譯;性能
AOT,Ahead Of Time,指運行前編譯,是兩種程序的編譯方式優化
區別
這兩種編譯方式的主要區別在因而否在「運行時」進行編譯進程
優劣
JIT優勢:
能夠根據當前硬件狀況實時編譯生成最優機器指令(ps. AOT也能夠作到,在用戶使用是使用字節碼根據機器狀況在作一次編譯)
能夠根據當前程序的運行狀況生成最優的機器指令序列
當程序須要支持動態連接時,只能使用JIT
能夠根據進程中內存的實際狀況調整代碼,使內存可以更充分的利用
JIT缺點:
編譯須要佔用運行時資源,會致使進程卡頓
因爲編譯時間須要佔用運行時間,對於某些代碼的編譯優化不能徹底支持,須要在程序流暢和編譯時間之間作權衡
在編譯準備和識別頻繁使用的方法須要佔用時間,使得初始編譯不能達到最高性能
AOT優勢:
在程序運行前編譯,能夠避免在運行時的編譯性能消耗和內存消耗
能夠在程序運行初期就達到最高性能
能夠顯著的加快程序的啓動
AOT缺點:
在程序運行前編譯會使程序安裝的時間增長
犧牲Java的一致性
將提早編譯的內容保存會佔用更多的外
與Android的關聯
Android在2.2的時候引入JIT,在kitkat時新增了ART(Android RunTime),在Android L時使用ART徹底替代了Dalvik做爲默認的虛擬機環境。內存
Dalvik
Dalvik使用JIT,使用.dex字節碼,是針對Android設備優化後的DVM所使用的運行時編譯字節碼。資源
.odex是對dex的優化,deodex在系統第一次開機時會提取全部apk內的dex文件,odex優化將dex提早提取出,加快了開機的速度和程序運行的速度
ART
ART 使用AOT,在安裝apk時會進行預編譯,生成OAT文件,仍以.odex保存,可是與Dalvik下不一樣,這個文件是可執行文件
dex、odex 都可經過dex2oat生成oat文件,以實現兼容性。在大型應用安裝時須要更多時間和空間
Android N引入的混合編譯虛擬機
在Android N中引入了一種新的編譯模式,同時使用JIT和AOT。這是我在網上找到的一些解釋:it
包含了一個混合模式的運行時。應用在安裝時不作編譯,而是解釋字節碼,因此能夠快速啓動。ART中有一種新的、更快的解釋器,經過一種新的JIT完成,編譯
可是這種JIT的信息不是持久化的。取而代之的是,代碼在執行期間被分析,分析結果保存起來。而後,當設備空轉和充電的時候,ART會執行鍼對「熱代碼」進行的基於分析的編譯,兼容性
其餘代碼不作編譯。爲了獲得更優的代碼,ART採用了幾種技巧包括深度內聯。 對同一個應用能夠編譯數次,或者找到變「熱」的代碼路徑或者對已經編譯的代碼進行新的優化,硬件
這取決於分析器在隨後的執行中的分析數據。
新的ART在安裝程序時使用JIT,在JIT編譯了一些代碼後將這些代碼保存到本地,等到設備空閒的時候將保存的這些代碼使用AOT編譯生成可執行文件保存到本地,待下次運行時直接使用,而且不斷監視代碼的更新,在代碼有更新後從新生成可執行文件。