2018年5月10日 星期四

Android 中的Dalvik和ART是什么,有啥区别?

原文 https://www.jianshu.com/p/58f817d176b7

什麼是Dalvik?


Dalvik是Google公司自己設計用於Android平台的虛擬機
Dalvik虛擬機是Google等廠商合作開發的Android移動設備平台的核心組成部分之一。
它可以支持已轉換為** .dex格式**的Java應用程序的運行,.dex格式是專為Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。
Dalvik經過優化,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik應用作為一個獨立的Linux進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。
很長時間以來,Dalvik虛擬機一直被用戶指責為拖慢安卓系統運行速度不如IOS的根源。
2014年6月25日,Android L正式亮相於召開的谷歌I/O大會,Android L改動幅度較大,谷歌將直接刪除Dalvik,代替它的是傳聞已久的ART。

Dalvik和JVM有啥關係?


主要區別:
Dalvik是基於寄存器的,而JVM是基於棧的。
Dalvik運行dex文件,而JVM運行java字節碼
自Android 2.2開始,Dalvik支持JIT(just-in-time,即時編譯技術)。
優化後的Dalvik較其他標準虛擬機存在一些不同特性 : 
1.佔用更少空間 
2.為簡化翻譯,常量池只使用32位索引  
3.標準Java字節碼實行8位堆棧指令,Dalvik使用16位指令集直接作用於局部變量。局部變量通常來自4位的“虛擬寄存器”區。這樣減少了Dalvik的指令計數,提高了翻譯速度。 
 當Android啟動時,Dalvik VM監視所有的程序(APK),並且創建依存關係樹,為每個程序優化代碼並存儲在Dalvik緩存中。Dalvik第一次加載後會生成Cache文件,以提供下次快速加載,所以第一次會很慢。
 Dalvik解釋器採用預先算好的Goto地址,每個指令對內存的訪問都在64字節邊界上對齊。這樣可以節省一個指令後進行查表的時間。為了強化功能, Dalvik還提供了快速翻譯器(Fast Interpreter)。
一般來說,基於堆棧的機器必須使用指令才能從堆棧上的加載和操作數據,因此,相對基於寄存器的機器,它們需要更多的指令才能實現相同的性能。但是基於寄存器機器上的指令必須經過編碼,因此,它們的指令往往更大。
Dalvik虛擬機既不支持Java SE 也不支持Java ME類庫(如:Java類,AWT和Swing都不支持)。相反,它使用自己建立的類庫(Apache Harmony Java的一個子集)。

什麼是ART?


即Android Runtime
ART的機制與Dalvik不同。在Dalvik下,應用每次運行的時候,字節碼都需要通過即時編譯器(just in time ,JIT)轉換為機器碼,這會拖慢應用的運行效率,而在ART環境中,應用在第一次安裝的時候,字節碼就會預先編譯成機器碼,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動(首次)和執行都會變得更加快速。
ART有什麼優缺點呢?

優點:
1、系統性能的顯著提升。
2、應用啟動更快、運行更快、體驗更流暢、觸感反饋更及時。
3、更長的電池續航能力。
4、支持更低的硬件。
缺點:
1.機器碼佔用的存儲空間更大,字節碼變為機器碼之後,可能會增加10%-20%(不過在應用包中,可執行的代碼常常只是一部分。比如最新的Google+ APK是28.3 MB,但是代碼只有6.9 MB。)
2.應用的安裝時間會變長。
tips:現在智能手機大部分都可以讓用戶選擇使用Dalvik還是ART模式。當然默認還是使用Dalvik模式。
用法:設置-輔助功能-開發者選項(開發人員工具)-選擇運行環境(不同的手機設置的步驟可能不一樣)。


作者:姜康
链接:https://www.jianshu.com/p/58f817d176b7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

沒有留言: