Dalvik和ART執行時環境的區別
在此,我並沒有打算深入的學習Dalvik和ART兩種方式的實現原理,只是想知道他倆的區別。之前,也是零零散散的看過,並沒有總結成文字。在此,總結下。
Dalvik
以下內容來自wikipedia
Dalvik虛擬機器,是Google等廠商合作開發的Android移動裝置平臺的核心組成部分之一。它可以支援已轉換為.dex(即“Dalvik Executable”)格式的Java應用程式的執行。.dex格式是專為Dalvik設計的一種壓縮格式,適合記憶體和處理器速度有限的系統。Dalvik由Dan Bornstein編寫的,名字來源於他的祖先曾經居住過的小漁村達爾維克(Dalvík),位於冰島Eyjafjörður。
大多數虛擬機器包括JVM都是一種堆疊機器,而Dalvik虛擬機器則是暫存器機。兩種架構各有優劣,一般而言,基於堆疊的機器需要更多指令,而基於暫存器的機器指令更長。
Dalvik經過優化後,允許在有限的記憶體中同時執行多個虛擬機器的例項,並且每一個Dalvik應用作為一個獨立的Linux程式執行,獨立的程式可以防止在虛擬機器崩潰的時候所有程式都被關閉。其實就是每一個應用都是作為獨自的虛擬機器執行,與其他應用互不牽扯。目前在Android4.4及其以下的版本中,應該全都是使用的Dalvik這種模式。
ART (Android Runtime)
Android Runtime(縮寫為 ART),是一種在Android作業系統上的執行環境,由Google公司研發,並在2013年作為Android 4.4系統中的一項測試功能正式對外發布,在Android 5.0及後續Android版本中作為正式的執行時庫取代了以往的Dalvik虛擬機器。ART能夠把應用程式的位元組碼轉換為機器碼,是Android所使用的一種新的虛擬機器。它與Dalvik的主要不同在於:Dalvik採用的是JIT技術,而ART採用Ahead-of-time(AOT)技術。 ART同時也改善了效能、垃圾回收(Garbage Collection)、應用程式除錯以及效能分析。
JIT最早在Android 2.2系統中引進到Dalvik虛擬機器中,在應用程式啟動時,JIT通過進行連續的效能分析來優化程式程式碼的執行,在程式執行的過程中,Dalvik虛擬機器在不斷的進行將位元組碼編譯成機器碼的工作。 與Dalvik虛擬機器不同的是,ART引入了AOT這種預編譯技術,在應用程式安裝的過程中,ART就已經將所有的位元組碼重新編譯成了機器碼。應用程式執行過程中無需進行實時的編譯工作,只需要進行直接呼叫。因此,ART極大的提高了應用程式的執行效率,同時也減少了手機的電量消耗,提高了移動裝置的續航能力,在垃圾回收等機制上也有了較大的提升。 為了保證向下相容,ART使用了相同的Dalvik位元組碼檔案(dex),即在應用程式目錄下保留了dex檔案供舊程式呼叫然而.odex檔案則替換成了可執行與可連結格式(ELF)可執行檔案。一旦一個程式被ART的dex2oat命令編譯,那麼這個程式將會指通過ELF可執行檔案來執行。因此,相對於Dalvik虛擬機器模式,ART模式下Android應用程式的安裝需要消耗更多的時間,同時也會佔用更大的儲存空間(指內部儲存,用於儲存編譯後的程式碼),但節省了很多Dalvik虛擬機器用於實時編譯的時間。
Google公司在Android 4.4中帶來的ART模式僅僅是ART的一個預覽版,系統預設仍然使用的是Dalvik虛擬機器,4.4上面提供的預覽版ART相對於Android 5.0以後的ART執行時庫有較大的不同,尤其體現在相容性上。
以上內容摘自Wikipedia
那麼,Dalvik和ART的區別是啥呢?
平臺支援差別:
Dalvik Android 4.4 及其以下平臺使用的虛擬機器;
ART Android4.4以上平臺使用的虛擬機器技術;
工作原理差別:
在應用程式啟動時,JIT通過進行連續的效能分析來優化程式程式碼的執行,在程式執行的過程中,Dalvik虛擬機器在不斷的進行將位元組碼編譯成機器碼的工作。
ART引入了AOT這種預編譯技術,在應用程式安裝的過程中,ART就已經將所有的位元組碼重新編譯成了機器碼。應用程式執行過程中無需進行實時的編譯工作,只需要進行直接呼叫.因此,ART極大的提高了應用程式的執行效率,同時也減少了手機的電量消耗,提高了移動裝置的續航能力,在垃圾回收等機制上也有了較大的提升。
相對於Dalvik虛擬機器模式,ART模式下Android應用程式的安裝需要消耗更多的時間,同時也會佔用更大的儲存空間(指內部儲存,用於儲存編譯後的程式碼),但節省了很多Dalvik虛擬機器用於實時編譯的時間
總結:
編譯模式 | RAM記憶體 | ROM記憶體 | 流暢度 | 省電 | 相容性 | 載入速度 |
Dalvik | 大 | 小 | 普通 | 普通 | 好 | 慢 |
ART | 小 | 大 | 好 | 好 | 有待優化 | 快 |
參考資料:
相關文章
- Dalvik和ART的區別
- Jvm、Dalvik和Art的區別JVM
- Android 中的Dalvik和ART是什麼,有啥區別?Android
- SAP Commerce Cloud 構建環境和最終執行環境的區別Cloud
- SAP雲平臺執行環境Cloud Foundry和Neo的區別Cloud
- 【譯】JS執行時環境JS
- 也來看看Android的ART執行時Android
- 執行環境和作用域
- Android執行時ART載入類和方法的過程分析Android
- JS變數和執行環境JS變數
- 搭建區塊鏈技術開發和執行環境(一)區塊鏈
- 搭建區塊鏈技術開發和執行環境(二)區塊鏈
- 執行緒和程式的區別執行緒
- 程式和執行緒的區別執行緒
- Dalvik 和 ART 有什麼區別?深扒 Android 虛擬機器發展史,真相卻出乎意料!Android虛擬機
- 大資料執行環境的執行大資料
- 執行時異常和檢查性異常區別
- JavaScript執行環境與執行棧JavaScript
- Apache Thrift 配置環境和執行(Linux)ApacheLinux
- PHPWAMP的優點以及使用方式、PHPWAMP綠色環境和其他整合環境的區別PHP
- 執行環境和變數物件的深入理解變數物件
- 使用 ARChon 執行時環境在 Ubuntu 上執行 Android 應用UbuntuAndroid
- 程式和執行緒的區別(Linux)執行緒Linux
- Java執行環境配置Java
- 一篇文章告訴你Dalvik 和JVM的區別JVM
- Linux環境的PHP執行LinuxPHP
- ART執行時垃圾收集機制簡要介紹和學習計劃
- 「Learning」區別執行緒和程式執行緒
- Android執行時ART載入OAT檔案的過程分析Android
- 程式和執行緒的區別與聯絡執行緒
- java架構-執行緒和程式的區別Java架構執行緒
- Linux中執行緒和程式的區別Linux執行緒
- Java多執行緒--併發和並行的區別Java執行緒並行
- js執行環境總結JS
- laradock swoole 執行環境
- Scala--執行環境搭建
- 執行環境及作用域
- 搭建go環境並執行Go