Dalvik 和 ART 有什麼區別?深扒 Android 虛擬機發展史,真相卻出乎意料!

自 2008 年 9 月 23 日對外發布第一個版本 Android 1.0 以來,在摩爾定律安迪比爾定律的共同做用下,Android 系統以每一年至少一次重大更新(2016 年至今每一年一次)速度進行迭代,在進行版本迭代的過程當中,Android 虛擬機的發展不可忽視。android

Android 誕生之初

在 Android 系統初期,不一樣於 Java 平臺使用 JVM 加載字節碼文件(.class),Android 系統由 Dalvik 擔任虛擬機的角色,每次運行程序的時候,Dalvik 負責加載 dex/odex 文件並解析成機器碼交由系統調用。函數

Android 2.2 —— JIT 首次登場

爲了適應硬件速度的提高,Android 系統系統也在不斷更新,單一的 Dalvik 虛擬機已經漸漸地知足系統的要求了,2010 年 5 月 20 日,Google 發佈 Android 2.2(Froyo凍酸奶),在這個版本中,Google 在 Android 虛擬中加入了 JIT 編譯器(Just-In-Time Compiler)。性能

和其餘大多數 JVM 同樣,Dalvik 使用 JIT 進行即時編譯,藉助 Java HotSpot VM,JIT 編譯器能夠對執行次數頻繁的 dex/odex 代碼進行編譯與優化,將 dex/odex 中的 Dalvik Code(Smali 指令集)翻譯成至關精簡的 Native Code 去執行,JIT 的引入使得 Dalvik 的性能提高了 3~6 倍。優化

可是 JIT 模式的缺點也不容忽視:翻譯

  • 每次啓動應用都須要從新編譯
  • 運行時比較耗電,形成電池額外的開銷

JIT

Andorid 4.4 —— ART 和 AOT

2013 年 10 月 31 日,Google 發佈 Android 4.4(奇巧Kitkat),帶來了全新的虛擬機運行環境 ART(Android RunTime)的預覽版和全新的編譯策略 AOT(Ahead-of-time),須要注意的是,彼時 ART 是和 Dalvik 共存的,用戶能夠在二者之間進行選擇(感受怪怪的,用戶但是小透明啊)。3d

Android 5.0 —— ART 全面取代 Dalvik

2014 年 10 月 16 日,Google 發佈 Android 5.0(棒棒糖Lollipop),ART 全面取代 Dalvik 成爲 Android 虛擬機運行環境,至此,Dalvik 退出歷史舞臺,AOT 也成爲惟一的編譯模式。code

AOT 和 JIT 的不一樣之處在於:JIT 是在運行時進行編譯,是動態編譯,而且每次運行程序的時候都須要對 odex 從新進行編譯;而 AOT 是靜態編譯,應用在安裝的時候會啓動 dex2oat 過程把 dex 預編譯成 ELF 文件,每次運行程序的時候不用從新編譯,是真正意義上的本地應用。cdn

ART_Dalvik

另外,相比於 Dalvik,ART 對 Garbage Collection(GC)過程的也進行了改進:視頻

  1. 只有一次 GC 暫停(Dalvik 須要兩次)
  2. 在 GC 保持暫停狀態期間並行處理
  3. 在清理最近分配的短時對象這種特殊狀況中,回收器的總 GC 時間更短
  4. 優化了垃圾回收的工效,可以更加及時地進行並行垃圾回收,這使得 GC_FOR_ALLOC 事件在典型用例中極爲罕見
  5. 壓縮 GC 以減小後臺內存使用和碎片

AOT 模式解決了應用啓動和運行速度和耗電問題的同時也帶來了另外兩個問題:對象

  • 應用安裝和系統升級以後的應用優化比較耗時
  • 優化後的文件會佔用額外的存儲空間

AOT

這也給 Android 系統後續的優化埋下了伏筆。

Android 7.0 —— JIT 迴歸

用過 Android 手機的人應該都知道,在 Android 5.x 和 6.x 的機器上,系統每次 OTA 升級完成重啓的時候都會有個應用優化的過程,這個過程就是剛纔所說的 dex2oat 過程,這個過程比較耗時而且會佔用額外的存儲空間。

2016 年 8 月 22 日,Google 發佈 Android 7.0(牛軋糖Nougat),JIT 編譯器迴歸,造成 AOT/JIT 混合編譯模式,這種混合編譯模式的特色是:

  • 應用在安裝的時候 dex 不會被編譯
  • 應用在運行時 dex 文件先經過解析器(Interpreter)後會被直接執行(這一步驟跟 Android 2.2 - Android 4.4以前的行爲一致),與此同時,熱點函數(Hot Code)會被識別並被 JIT 編譯後存儲在 jit code cache 中並生成 profile 文件以記錄熱點函數的信息。
  • 手機進入 IDLE(空閒) 或者 Charging(充電) 狀態的時候,系統會掃描 App 目錄下的 profile 文件並執行 AOT 過程進行編譯。

能夠看出,混合編譯模式綜合了 AOT 和 JIT 的各類優勢,使得應用在安裝速度加快的同時,運行速度、存儲空間和耗電量等指標都獲得了優化。

AOT_JIT

總結

Android 系統從誕生到如今,經歷了幾回重要更新,最終選擇了折衷的方案,使得系統的安裝和運行的時候各項指標都獲得了優化,至此,Android 虛擬機的發展進程告一段落。可是,隨着硬件性能的不斷提高,相信谷歌的腳步不會就此中止,期待谷歌能在將來給咱們不斷帶來驚喜。

參考文章/視頻

www.youtube.com/watch?v=TCJ…

source.android.com/devices/tec…

www.jianshu.com/p/9a3a4eb32…

zh.wikipedia.org/wiki/Androi…

若是你對文章內容有不一樣意見,歡迎留言,咱們一同探討。

相關文章
相關標籤/搜索