Dalvik與ART的架構(gòu)差異,你學(xué)會(huì)了嗎?
Dalvik
Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的Java虛擬機(jī)。它是Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一,可以支持已轉(zhuǎn)換為.dex(即Dalvik Executable)格式的Java應(yīng)用程序的運(yùn)行。.dex格式是專(zhuān)為Dalvik設(shè)計(jì)的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。Dalvik經(jīng)過(guò)優(yōu)化,允許在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例,并且每一個(gè)Dalvik應(yīng)用作為一個(gè)獨(dú)立的Linux進(jìn)程執(zhí)行。獨(dú)立的進(jìn)程可以防止在虛擬機(jī)崩潰的時(shí)候所有程序都被關(guān)閉。此外,Dalvik虛擬機(jī)基于寄存器,與標(biāo)準(zhǔn)Java虛擬機(jī)(JVM)基于棧的架構(gòu)存在顯著差異。
- 原理:一個(gè)應(yīng)用首先經(jīng)過(guò)DX工具將class文件轉(zhuǎn)換成Dalvik虛擬機(jī)可以執(zhí)行的dex文件,然后由類(lèi)加載器加載原生類(lèi)和 Java類(lèi)。Dalvik虛擬機(jī)負(fù)責(zé)解釋器根據(jù)指令集對(duì)Dalvik字節(jié)碼進(jìn)行釋dex文件為機(jī)器碼。
- JIT編譯器:Dalvik負(fù)責(zé)將dex翻譯為機(jī)器碼交由系統(tǒng)調(diào)用,有一個(gè)缺陷,每次執(zhí)行代碼,都需要Dalvik將操作碼代碼翻譯為機(jī)器對(duì)應(yīng)的微處理器指令,然后交給底層系統(tǒng)處理,運(yùn)行效率很低。JIT編譯器,當(dāng)App運(yùn)行時(shí),每當(dāng)遇到一個(gè)新類(lèi),JIT編譯器就會(huì)對(duì)這個(gè)類(lèi)進(jìn)行即時(shí)編譯,經(jīng)過(guò)編譯后的代碼,會(huì)被優(yōu)化成相當(dāng)精簡(jiǎn)的原生型指令碼(即native code),這樣在下次執(zhí)行到相同邏輯的時(shí)候,速度就會(huì)更快。
- Dalvik的啟動(dòng)流程:Dalvik進(jìn)程管理是依賴(lài)于linux的進(jìn)程體系結(jié)構(gòu)的,如要為應(yīng)用程序創(chuàng)建一個(gè)進(jìn)程,它會(huì)使用linux的fork機(jī)制來(lái)復(fù)制一個(gè)進(jìn)程。
ART
ART(Android Runtime)是Android平臺(tái)上的一個(gè)運(yùn)行時(shí)環(huán)境,用于執(zhí)行Android應(yīng)用程序。它是Android操作系統(tǒng)的重要組成部分,為應(yīng)用程序提供了執(zhí)行環(huán)境。
ART是在Android 5.0(API級(jí)別21)中引入的,旨在改進(jìn)應(yīng)用程序的執(zhí)行性能和兼容性。在ART出現(xiàn)之前,Android使用的是Dalvik虛擬機(jī)作為其運(yùn)行時(shí)環(huán)境。與Dalvik相比,ART在運(yùn)行應(yīng)用程序時(shí)進(jìn)行了更多的優(yōu)化和編譯,從而提高了應(yīng)用程序的執(zhí)行效率和穩(wěn)定性。
當(dāng)應(yīng)用程序在Android設(shè)備上安裝時(shí),ART會(huì)將其轉(zhuǎn)換為已優(yōu)化的機(jī)器代碼,這有助于提高應(yīng)用程序的運(yùn)行速度。此外,ART還支持即時(shí)編譯(JIT),這意味著它在運(yùn)行時(shí)將字節(jié)碼轉(zhuǎn)換為機(jī)器代碼,進(jìn)一步提高了應(yīng)用程序的執(zhí)行效率。
- 原理:JIT是運(yùn)行時(shí)編譯,這樣可以對(duì)執(zhí)行次數(shù)頻繁的dex代碼進(jìn)行編譯和優(yōu)化,減少以后使用時(shí)的翻譯時(shí)間, 但將dex翻譯為本地機(jī)器碼也要占用時(shí)間。ART的策略與Dalvik不同,在ART環(huán)境中,應(yīng)用在第一次安裝的時(shí)候,字節(jié)碼就會(huì)預(yù)先編譯成機(jī)器碼,使其成為真正的本地應(yīng)用。之后打開(kāi)App的時(shí)候,不需要額外的翻譯工作,直接使用本地機(jī)器碼運(yùn)行,因此運(yùn)行速度提高。
- AOT:AOT是靜態(tài)編譯,應(yīng)用在安裝的時(shí)候會(huì)啟動(dòng)dex2oat過(guò)程把dex預(yù)編譯成ELF文件,每次運(yùn)行程序的時(shí)候不用重新編譯。
使用ART的好處:
- 提高應(yīng)用程序的執(zhí)行速度:由于ART采用了更高效的編譯方式,應(yīng)用程序的運(yùn)行速度得到了顯著提升。
- 更好的兼容性:ART對(duì)應(yīng)用程序的代碼進(jìn)行了更全面的優(yōu)化,減少了因代碼問(wèn)題導(dǎo)致的崩潰或錯(cuò)誤。
- 更少的內(nèi)存占用:ART的優(yōu)化編譯方式使得應(yīng)用程序占用的內(nèi)存更少,從而提高了設(shè)備的整體性能。
- 更好的安全性:ART對(duì)應(yīng)用程序代碼進(jìn)行了更嚴(yán)格的檢查和驗(yàn)證,增強(qiáng)了應(yīng)用程序的安全性。
區(qū)別
ART和Dalvik在執(zhí)行方式、編譯優(yōu)化和性能方面存在顯著差異。ART通過(guò)預(yù)編譯和全面優(yōu)化提供了更高的執(zhí)行效率和穩(wěn)定性,而Dalvik則更注重在有限內(nèi)存中的并發(fā)執(zhí)行能力。隨著Android版本的演進(jìn),ART逐漸成為默認(rèn)的運(yùn)行時(shí)環(huán)境,以提供更好的應(yīng)用程序性能和用戶體驗(yàn)。
Dalvik使用JIT,ART結(jié)合了兩者的優(yōu)勢(shì),使用AOT+JIT(Android7.0之后混合使用,Android5.0-Android7.0之前使用AOT)DVM時(shí)為32位CPU設(shè)計(jì)的,而 ART支持64位并兼容32位CPU,這也是DVM被淘汰的主要原因之一。ART對(duì)垃圾回收機(jī)制進(jìn)行了改進(jìn),比如更頻繁地執(zhí)行并行垃圾收集,將GC暫停由2次減少為1次等。
總結(jié)一下,它們之間存在一些關(guān)鍵的區(qū)別,主要表現(xiàn)在執(zhí)行方式、編譯優(yōu)化和性能等方面。
- 執(zhí)行方式:Dalvik是依賴(lài)于即時(shí)編譯(JIT)的,它在運(yùn)行應(yīng)用程序時(shí)將字節(jié)碼轉(zhuǎn)換為本地機(jī)器碼。這意味著應(yīng)用程序的代碼在每次運(yùn)行時(shí)都需要被解釋和編譯,這可能會(huì)導(dǎo)致一定的性能開(kāi)銷(xiāo)。相比之下,ART采用預(yù)編譯(AOT)方式,在應(yīng)用程序安裝時(shí)將其編譯成本地機(jī)器碼,從而減少了運(yùn)行時(shí)的編譯開(kāi)銷(xiāo),提高了執(zhí)行效率。
- 編譯優(yōu)化:Dalvik主要關(guān)注在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例,而ART則更注重應(yīng)用程序的執(zhí)行效率和穩(wěn)定性。ART在編譯過(guò)程中會(huì)對(duì)應(yīng)用程序代碼進(jìn)行更全面的優(yōu)化,包括空間優(yōu)化和時(shí)間優(yōu)化,以實(shí)現(xiàn)更快的執(zhí)行速度和更少的內(nèi)存占用。
- 性能:由于ART采用了預(yù)編譯和更全面的優(yōu)化方式,它在執(zhí)行應(yīng)用程序時(shí)通常表現(xiàn)出更高的性能。與Dalvik相比,ART可以實(shí)現(xiàn)更快的啟動(dòng)速度、更流暢的用戶體驗(yàn)和更低的功耗。此外,ART還支持更多的語(yǔ)言和框架,使得開(kāi)發(fā)人員能夠更加靈活地創(chuàng)建應(yīng)用程序。