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 | 小 | 大 | 好 | 好 | 有待優化 | 快 |
參考資料:
相關文章
- SAP Commerce Cloud 構建環境和最終執行環境的區別Cloud
- SAP雲平臺執行環境Cloud Foundry和Neo的區別Cloud
- Dalvik,ART與ODEX相愛相生
- 也來看看Android的ART執行時Android
- 【譯】JS執行時環境JS
- Dalvik 和 ART 有什麼區別?深扒 Android 虛擬機器發展史,真相卻出乎意料!Android虛擬機
- JS變數和執行環境JS變數
- 程序和執行緒的區別執行緒
- 執行緒和程式的區別執行緒
- 搭建區塊鏈技術開發和執行環境(一)區塊鏈
- 搭建區塊鏈技術開發和執行環境(二)區塊鏈
- 大資料執行環境的執行大資料
- Apache Thrift 配置環境和執行(Linux)ApacheLinux
- 一篇文章告訴你Dalvik 和JVM的區別JVM
- 執行npm install 和 yarn 命令時報錯找不到python環境NPMYarnPython
- JavaScript執行環境與執行棧JavaScript
- 「Learning」區別執行緒和程式執行緒
- linux執行環境&命令Linux
- openGauss-執行環境
- laradock swoole 執行環境
- windows terminal 中執行 miniconda 和 pip 的虛擬環境Windows
- polarphp 0.0.1 alpha 釋出:全新 PHP 執行時環境PHP
- Mac使用dinghy和laradock搭建php執行環境MacPHP
- 程式和執行緒的區別與聯絡執行緒
- java架構-執行緒和程式的區別Java架構執行緒
- shell中的source和直接執行sh的區別
- 作業系統的執行環境作業系統
- 1-1 JavaScript執行環境 執行棧JavaScript
- 搭建go環境並執行Go
- Scala--執行環境搭建
- 搭建本地執行Hadoop環境Hadoop
- js執行環境總結JS
- Java002-執行環境Java
- CLion和WSL配置MPI執行及除錯環境除錯
- Java 執行緒和作業系統的執行緒有啥區別?Java執行緒作業系統
- shell指令碼的三種執行方式和區別指令碼
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- php中的執行緒、程式和併發區別PHP執行緒