AndroidDalvik和ART有什么區(qū)別
黑白
發(fā)布于 云南 2018-12-27 · 2.2w瀏覽

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

Android 誕生之初

在 Android 系統(tǒng)初期,不同于 Java 平臺使用 JVM 加載字節(jié)碼文件(.class),Android 系統(tǒng)由 Dalvik 擔任虛擬機的角色,每次運行程序的時候,Dalvik 負責加載 dex/odex 文件并解析成機器碼交由系統(tǒng)調(diào)用。

Android 2.2 —— JIT 首次登場

為了適應硬件速度的提升,Android 系統(tǒng)系統(tǒng)也在不斷更新,單一的 Dalvik 虛擬機已經(jīng)漸漸地滿足系統(tǒng)的要求了,2010 年 5 月 20 日,Google 發(fā)布 Android 2.2(Froyo凍酸奶),在這個版本中,Google 在 Android 虛擬中加入了 JIT 編譯器(Just-In-Time Compiler)。

和其他大多數(shù) JVM 一樣,Dalvik 使用 JIT 進行即時編譯,借助 Java HotSpot VM,JIT 編譯器可以對執(zhí)行次數(shù)頻繁的 dex/odex 代碼進行編譯與優(yōu)化,將 dex/odex 中的 Dalvik Code(Smali 指令集)翻譯成相當精簡的 Native Code 去執(zhí)行,JIT 的引入使得 Dalvik 的性能提升了 3~6 倍。

但是 JIT 模式的缺點也不容忽視:

  • 每次啟動應用都需要重新編譯

  • 運行時比較耗電,造成電池額外的開銷


JIT


Andorid 4.4 —— ART 和 AOT

2013 年 10 月 31 日,Google 發(fā)布 Android 4.4(奇巧Kitkat),帶來了全新的虛擬機運行環(huán)境 ART(Android RunTime)的預覽版和全新的編譯策略 AOT(Ahead-of-time),需要注意的是,彼時 ART 是和 Dalvik 共存的,用戶可以在兩者之間進行選擇(感覺怪怪的,用戶可是小透明?。?/p>

Android 5.0 —— ART 全面取代 Dalvik

2014 年 10 月 16 日,Google發(fā)布Android 5.0(棒棒糖Lollipop),ART 全面取代 Dalvik 成為 Android 虛擬機運行環(huán)境,至此,Dalvik 退出歷史舞臺,AOT 也成為唯一的編譯模式。

AOT 和 JIT 的不同之處在于:JIT 是在運行時進行編譯,是動態(tài)編譯,并且每次運行程序的時候都需要對 odex 重新進行編譯;而 AOT 是靜態(tài)編譯,應用在安裝的時候會啟動 dex2oat 過程把 dex 預編譯成 ELF 文件,每次運行程序的時候不用重新編譯,是真正意義上的本地應用。


ART_Dalvik


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

  1. 只有一次 GC 暫停(Dalvik 需要兩次)

  2. 在 GC 保持暫停狀態(tài)期間并行處理

  3. 在清理最近分配的短時對象這種特殊情況中,回收器的總 GC 時間更短

  4. 優(yōu)化了垃圾回收的工效,能夠更加及時地進行并行垃圾回收,這使得 GC_FOR_ALLOC 事件在典型用例中極為罕見

  5. 壓縮 GC 以減少后臺內(nèi)存使用和碎片

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

  • 應用安裝和系統(tǒng)升級之后的應用優(yōu)化比較耗時

  • 優(yōu)化后的文件會占用額外的存儲空間


AOT


這也給 Android 系統(tǒng)后續(xù)的優(yōu)化埋下了伏筆。

Android 7.0 —— JIT 回歸

用過 Android 手機的人應該都知道,在 Android 5.x 和 6.x 的機器上,系統(tǒng)每次 OTA 升級完成重啟的時候都會有個應用優(yōu)化的過程,這個過程就是剛才所說的 dex2oat 過程,這個過程比較耗時并且會占用額外的存儲空間。

2016年8月22日,Google發(fā)布Android 7.0(牛軋?zhí)荖ougat),JIT 編譯器回歸,形成 AOT/JIT 混合編譯模式,這種混合編譯模式的特點是:

  • 應用在安裝的時候 dex 不會被編譯

  • 應用在運行時 dex 文件先通過解析器(Interpreter)后會被直接執(zhí)行(這一步驟跟 Android 2.2 - Android 4.4之前的行為一致),與此同時,熱點函數(shù)(Hot Code)會被識別并被 JIT 編譯后存儲在 jit code cache 中并生成 profile 文件以記錄熱點函數(shù)的信息。

  • 手機進入 IDLE(空閑) 或者 Charging(充電) 狀態(tài)的時候,系統(tǒng)會掃描 App 目錄下的 profile 文件并執(zhí)行 AOT 過程進行編譯。

可以看出,混合編譯模式綜合了 AOT 和 JIT 的各種優(yōu)點,使得應用在安裝速度加快的同時,運行速度、存儲空間和耗電量等指標都得到了優(yōu)化。


AOT_JIT


總結

Android 系統(tǒng)從誕生到現(xiàn)在,經(jīng)歷了幾次重要更新,最終選擇了折衷的方案,使得系統(tǒng)的安裝和運行的時候各項指標都得到了優(yōu)化,至此,Android 虛擬機的發(fā)展進程告一段落。但是,隨著硬件性能的不斷提升,相信谷歌的腳步不會就此停止,期待谷歌能在未來給我們不斷帶來驚喜。


黑白
2333
瀏覽 2.2w
相關推薦
最新評論
贊過的人
評論加載中...

暫無評論,快來評論吧!