Dalvik虛擬機器
Dalvik虛擬機器,是Google等廠商合作開發的Android流動裝置平台的核心組成部分之一。它可以支援已轉換為.dex(即「Dalvik Executable」)格式的Java應用程式的執行。.dex格式是專為Dalvik設計的一種壓縮格式,適合主記憶體和處理器速度有限的系統。Dalvik由Dan Bornstein編寫的,名字來源於他的祖先曾經居住過的小漁村達爾維克(Dalvík),位於冰島埃亞峽灣。
原作者 | Dan Bornstein |
---|---|
原始碼庫 | |
作業系統 | Linux |
平台 | Android |
類型 | 虛擬機器 |
許可協定 | Apache License 2.0 |
網站 | https://source.android.com/devices/tech/dalvik/index.html |
副檔名 |
.dex |
---|
大多數虛擬機器包括JVM都是一種堆疊機器,而Dalvik虛擬機器則是暫存器機。兩種架構各有優劣,一般而言,基於堆疊的機器需要更多指令,而基於暫存器的機器指令更長。
從Android 5.0版起,Android Runtime(ART)取代Dalvik成為系統內預設虛擬機。
架構
dx工具是一種用來轉換Java class成為DEX格式的工具。多個類被包含在一個dex檔案之中。各個類中重複的字串和其他常數只在DEX中存放一次,以節省空間。Java位元組碼(bytecode)被轉換成Dalvik虛擬機所使用的替代指令集。一個未壓縮dex檔案通常稍小於一個已經壓縮的.jar檔。
安裝到流動裝置之時,Dalvik可執行檔可能會被修改。為了獲得進一步最佳化,虛擬機器可能會調整檔案內部分數據的端序、行內一些函數和簡單的結構體、並短路掉一些不必要的操作。
當Android啟動時,Dalvik VM監視所有的程式(APK),並且建立依存關係樹,為每個程式最佳化代碼並儲存在Dalvik快取中。Dalvik第一次載入後會生成Cache檔案,以提供下次快速載入,所以第一次會很慢。
Dalvik直譯器採用預先算好的Goto地址,每個指令對主記憶體的訪問都在64位元組邊界上對齊。這樣可以節省一個指令後進行查表的時間。為了強化功能, Dalvik還提供了快速翻譯器(Fast Interpreter)。[來源請求]
dx
dx是一套工具,可以將Java .class轉換成.dex格式。一個dex檔通常會有多個.class。由於dex有時必須進行最佳化,會使檔案大小增加1-4倍,以ODEX結尾。
差異
- Dalvik虛擬機器早期並沒有使用即時編譯(JIT)技術。從Android 2.2開始,Dalvik虛擬機器也支援JIT。
- Dalvik虛擬機器有自己的位元組碼,並非使用Java位元組碼。
- Dalvik基於暫存器,而JVM基於堆疊。
- Dalvik VM透過Zygote進行類別的預載入,Zygote會完成虛擬機器的初始化,也是與JVM不同之處。