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中引入了一種新的編譯模式,同時使用JIT和AOT。這是我在網上找到的一些解釋:
包含了一個混合模式的運行時。應用在安裝時不做編譯,而是解釋字節碼,所以可以快速啟動。ART中有一種新的、更快的解釋器,通過一種新的JIT完成,但是這種JIT的信息不是持久化的。取而代之的是,代碼在執行期間被分析,分析結果保存起來。然后,當設備空轉和充電的時候,ART會執行針對“熱代碼”進行的基於分析的編譯,其他代碼不做編譯。為了得到更優的代碼,ART采用了幾種技巧包括深度內聯。 對同一個應用可以編譯數次,或者找到變“熱”的代碼路徑或者對已經編譯的代碼進行新的優化,這取決於分析器在隨后的執行中的分析數據。
新的ART在安裝程序時使用JIT,在JIT編譯了一些代碼后將這些代碼保存到本地,等到設備空閑的時候將保存的這些代碼使用AOT編譯生成可執行文件保存到本地,待下次運行時直接使用,並且不斷監視代碼的更新,在代碼有更新后重新生成可執行文件。