Android 中的Dalvik和ART是什麼,有啥區別?
什麼是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模式。
用法:設定-輔助功能-開發者選項(開發人員工具)-選擇執行環境(不同的手機設定的步驟可能不一樣)。
歡迎關注該公眾號,不定期分享技術文章
相關文章
- Dalvik和ART的區別
- Jvm、Dalvik和Art的區別JVM
- Dalvik 和 ART 有什麼區別?深扒 Android 虛擬機器發展史,真相卻出乎意料!Android虛擬機
- Dalvik和ART執行時環境的區別
- git的遠端分支是幹啥的,和本地的有什麼區別?Git
- Telnet是什麼意思?與SSH有啥區別?
- cookie是什麼?和session有什麼區別?CookieSession
- Java和Python是什麼?有什麼區別?JavaPython
- Android中drawable和mipmap到底有什麼區別Android
- Linux中fork和exec是什麼?有何區別?Linux
- Android JNI和NDK有什麼區別Android
- c++中&和&&有什麼區別C++
- 什麼是報表工具?和 EXCEL 有什麼區別?Excel
- Java 介面和抽象類是什麼,有什麼區別Java抽象
- 什麼是 MicroPython?和CPython有什麼區別?Python
- 什麼是SCRM系統?和CRM有什麼區別?
- png是什麼格式 png和jpg有什麼區別
- xpgu是什麼 xgpu和xgp有什麼區別GPU
- Android的BroadcastReceiver和EventBus區別是什麼AndroidAST
- WPF中的StaticResource和DynamicResource有什麼區別
- C# 中的 == 和 equals()有什麼區別?C#
- 海外HTTP代理中全域性代理和區域性代理是什麼?有什麼區別?HTTP
- 什麼是中斷?什麼是異常?它們有何區別?
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- aPaaS是什麼(aPaaS平臺和IPaaS的區別是啥?大白話解釋)
- MySQL、NoSQL分別是什麼?有什麼區別?MySql
- CRM和CRM系統是什麼意思,有什麼區別?
- 反向代理是什麼?和正向代理有什麼區別呢?
- linux和ubuntu區別是什麼?有什麼關係?LinuxUbuntu
- 【網路安全】VPN是什麼?VPN與堡壘機有啥區別?
- sem和seo有什麼區別?各自的優劣勢是什麼?
- require和import有啥區別?UIImport
- Linux中什麼是打包?與歸檔有什麼區別?Linux
- 等保1.0和2.0分別是什麼?兩者有什麼區別?
- *和body有什麼區別
- 什麼是企業中臺?它和低程式碼平臺有什麼區別?
- 什麼是Asp.net Core?和 .net core有什麼區別?ASP.NET
- 優思學院|CTP和CTQ是什麼?有什麼區別?