Android中的Dalvik和ART詳解及區(qū)別分析
要想知道Dalvik和ART區(qū)別分析,首先我們要分別知道這兩者是什么?
什么是Dalvik?
Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的虛擬機(jī)。
Dalvik虛擬機(jī)是Google等廠商合作開發(fā)的Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一。
它可以支持已轉(zhuǎn)換為 .dex格式的Java應(yīng)用程序的運(yùn)行,.dex格式是專為Dalvik設(shè)計(jì)的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。
Dalvik 經(jīng)過優(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)閉。
很長時(shí)間以來,Dalvik虛擬機(jī)一直被用戶指責(zé)為拖慢安卓系統(tǒng)運(yùn)行速度不如IOS的根源。
2014年6月25日,Android L 正式亮相于召開的谷歌I/O大會(huì),Android L 改動(dòng)幅度較大,谷歌將直接刪除Dalvik,代替它的是傳聞已久的ART。
什么是ART?
即Android Runtime
ART 的機(jī)制與 Dalvik 不同。在Dalvik下,應(yīng)用每次運(yùn)行的時(shí)候,字節(jié)碼都需要通過即時(shí)編譯器(just in time ,JIT)轉(zhuǎn)換為機(jī)器碼,這會(huì)拖慢應(yīng)用的運(yùn)行效率,而在ART 環(huán)境中,應(yīng)用在第一次安裝的時(shí)候,字節(jié)碼就會(huì)預(yù)先編譯成機(jī)器碼,使其成為真正的本地應(yīng)用。這個(gè)過程叫做預(yù)編譯(AOT,Ahead-Of-Time)。這樣的話,應(yīng)用的啟動(dòng)(首次)和執(zhí)行都會(huì)變得更加快速。
下面是區(qū)別分析
Dalvik和JVM有啥關(guān)系?
主要區(qū)別:
Dalvik是基于寄存器的,而JVM是基于棧的。
Dalvik運(yùn)行dex文件,而JVM運(yùn)行java字節(jié)碼
自Android 2.2開始,Dalvik支持JIT(just-in-time,即時(shí)編譯技術(shù))。
優(yōu)化后的Dalvik較其他標(biāo)準(zhǔn)虛擬機(jī)存在一些不同特性:
1.占用更少空間
2.為簡化翻譯,常量池只使用32位索引
3.標(biāo)準(zhǔn)Java字節(jié)碼實(shí)行8位堆棧指令,Dalvik使用16位指令集直接作用于局部變量。局部變量通常來自4位的“虛擬寄存器”區(qū)。這樣減少了Dalvik的指令計(jì)數(shù),提高了翻譯速度?!?br />
當(dāng)Android啟動(dòng)時(shí),Dalvik VM 監(jiān)視所有的程序(APK),并且創(chuàng)建依存關(guān)系樹,為每個(gè)程序優(yōu)化代碼并存儲(chǔ)在Dalvik緩存中。Dalvik第一次加載后會(huì)生成Cache文件,以提供下次快速加載,所以第一次會(huì)很慢。
Dalvik解釋器采用預(yù)先算好的Goto地址,每個(gè)指令對(duì)內(nèi)存的訪問都在64字節(jié)邊界上對(duì)齊。這樣可以節(jié)省一個(gè)指令后進(jìn)行查表的時(shí)間。為了強(qiáng)化功能, Dalvik還提供了快速翻譯器(Fast Interpreter)。
一般來說,基于堆棧的機(jī)器必須使用指令才能從堆棧上的加載和操作數(shù)據(jù),因此,相對(duì)基于寄存器的機(jī)器,它們需要更多的指令才能實(shí)現(xiàn)相同的性能。但是基于寄存器機(jī)器上的指令必須經(jīng)過編碼,因此,它們的指令往往更大。
Dalvik虛擬機(jī)既不支持Java SE 也不支持Java ME類庫(如:Java類,AWT和Swing都不支持)。 相反,它使用自己建立的類庫(Apache Harmony Java的一個(gè)子集)。
ART有什么優(yōu)缺點(diǎn)呢?
優(yōu)點(diǎn):
1、系統(tǒng)性能的顯著提升。
2、應(yīng)用啟動(dòng)更快、運(yùn)行更快、體驗(yàn)更流暢、觸感反饋更及時(shí)。
3、更長的電池續(xù)航能力。
4、支持更低的硬件。
缺點(diǎn):
1.機(jī)器碼占用的存儲(chǔ)空間更大,字節(jié)碼變?yōu)闄C(jī)器碼之后,可能會(huì)增加10%-20%(不過在應(yīng)用包中,可執(zhí)行的代碼常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是代碼只有 6.9 MB。)
2.應(yīng)用的安裝時(shí)間會(huì)變長。
tips:現(xiàn)在智能手機(jī)大部分都可以讓用戶選擇使用Dalvik還是ART模式。當(dāng)然默認(rèn)還是使用Dalvik模式。
用法:設(shè)置-輔助功能-開發(fā)者選項(xiàng)(開發(fā)人員工具)-選擇運(yùn)行環(huán)境(不同的手機(jī)設(shè)置的步驟可能不一樣)。
Dalvik和ART的幾點(diǎn)區(qū)別
dalvik是執(zhí)行的時(shí)候編譯+運(yùn)行,安裝比較快,開啟應(yīng)用比較慢,應(yīng)用占用空間小
ART是安裝的時(shí)候就編譯好了,執(zhí)行的時(shí)候直接就可以運(yùn)行的,安裝慢,開啟應(yīng)用快,占用空間大
用個(gè)比喻來說就是,騎自行車
dalvik 是已經(jīng)折疊起來的自行車,每次騎都要先組裝自行車才能騎
ART 是已經(jīng)組裝好的自行車,每次騎直接上車就能走人
相關(guān)文章
Android編程創(chuàng)建桌面快捷方式的常用方法小結(jié)【2種方法】
這篇文章主要介紹了Android編程創(chuàng)建桌面快捷方式的常用方法,結(jié)合實(shí)例形式總結(jié)分析了2種常見的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02Android 圖像處理(類型轉(zhuǎn)換,比例縮放,倒影,圓角)的小例子
Android 圖像處理(類型轉(zhuǎn)換,比例縮放,倒影,圓角)的小例子,需要的朋友可以參考一下2013-05-05Android系統(tǒng)檢測(cè)程序內(nèi)存占用各種方法
這篇文章主要介紹了Android系統(tǒng)檢測(cè)程序內(nèi)存占用各種方法,本文講解了檢查系統(tǒng)總內(nèi)存、檢查某個(gè)程序的各類型內(nèi)存占用、檢查程序狀態(tài)、檢查程序各部分的內(nèi)存占用等內(nèi)容,需要的朋友可以參考下2015-03-03android實(shí)現(xiàn)session保持簡要概述及實(shí)現(xiàn)
其實(shí)sesion在瀏覽器和web服務(wù)器直接是通過一個(gè)叫做name為sessionid的cookie來傳遞的,所以只要在每次數(shù)據(jù)請(qǐng)求時(shí)保持sessionid是同一個(gè)不變就可以用到web的session了,感興趣的你可以參考下本文或許對(duì)你有所幫助2013-03-03Android搜索結(jié)果顯示高亮實(shí)例(有數(shù)據(jù)滑動(dòng)底部自動(dòng)刷新)
本篇文章主要介紹了Android搜索結(jié)果顯示高亮實(shí)例(有數(shù)據(jù)滑動(dòng)底部自動(dòng)刷新),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04Android 模擬器(JAVA)與C++ socket 通訊 分享
Android 模擬器(JAVA)與C++ socket 通訊 分享,需要的朋友可以參考一下2013-05-05Android Internet應(yīng)用實(shí)現(xiàn)獲取天氣預(yù)報(bào)的示例代碼
這篇文章主要介紹了Android網(wǎng)絡(luò)編程及Internet應(yīng)用-獲取天氣,小編覺得挺不錯(cuò)的,一起跟隨小編過來看看吧2018-05-05Android開發(fā)實(shí)現(xiàn)在Wifi下獲取本地IP地址的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)在Wifi下獲取本地IP地址的方法,涉及Android編程Wifi的調(diào)用及IP地址的獲取與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-09-09