Android里的Dalvik、ART、JIT、AOT有什么關系?


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編譯生成可執行文件保存到本地,待下次運行時直接使用,並且不斷監視代碼的更新,在代碼有更新后重新生成可執行文件。

 

原文:https://www.cnblogs.com/linghu-java/p/10577515.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM