Android系統(tǒng)Dalvik虛擬機(jī)與Java虛擬機(jī)的區(qū)別
- 作者:新網(wǎng)
- 來源:新網(wǎng)
- 瀏覽:100
- 2018-05-02 17:49:25
Dalvik虛擬機(jī)作為Android平臺(tái)的核心組件,擁有如下幾個(gè)特點(diǎn):體積小,占用內(nèi)存空間小;專有的DEX可執(zhí)行文件格式,體積更小,執(zhí)行速度更快;常量池采用32位索引值,尋址類方法名、字段名、常量更快; 基于寄存器架構(gòu),并擁有一套完整的指令系統(tǒng).
Dalvik虛擬機(jī)作為Android平臺(tái)的核心組件,擁有如下幾個(gè)特點(diǎn):體積小,占用內(nèi)存空間小;專有的DEX可執(zhí)行文件格式,體積更小,執(zhí)行速度更快;常量池采用32位索引值,尋址類方法名、字段名、常量更快; 基于寄存器架構(gòu),并擁有一套完整的指令系統(tǒng).
<
div> 提供了對象生命周期管理、堆棧管理、線程管理、安全和異常管理以及垃圾回收等重要功能;
所有的Android程序都運(yùn)行在Android系統(tǒng)進(jìn)程里,每個(gè)進(jìn)程對應(yīng)著一個(gè)Dalvik虛擬機(jī)實(shí)例。
Dalvik虛擬機(jī)與Java虛擬機(jī)的區(qū)別
Dalvik虛擬機(jī)與傳統(tǒng)的Java虛擬機(jī)有許多不同點(diǎn),兩者并不兼容,它們顯著的不同主要表現(xiàn)在以下幾個(gè)方面:
1.Java虛擬機(jī)運(yùn)行的是Java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是Dalvik字節(jié)碼。
傳統(tǒng)的Java程序經(jīng)過編譯,生成Java字節(jié)碼保存在class文件中,Java虛擬機(jī)通過解碼class文件中的內(nèi)容來運(yùn)行程序。而Dalvik虛擬機(jī)運(yùn)行的是Dalvik字節(jié)碼,所有的Dalvik字節(jié)碼由Java字節(jié)碼轉(zhuǎn)換而來,并被打包到一個(gè)DEX(Dalvik Executable)可執(zhí)行文件中。Dalvik虛擬機(jī)通過解釋DEX文件來執(zhí)行這些字節(jié)碼。
2.Dalvik可執(zhí)行文件體積更小。
Android SDK中有一個(gè)叫dx的工具負(fù)責(zé)將Java字節(jié)碼轉(zhuǎn)換為Dalvik字節(jié)碼。dx工具會(huì)對Java類文件重新排列,消除在類文件中出現(xiàn)的所有冗余信息,避免虛擬機(jī)在初始化時(shí)出現(xiàn)重復(fù)的文件加載與解析過程。一般情況下,Java類文件中包含多個(gè)不同的方法簽名,如果其他的類文件引用該類文件中的方法,方法簽名也會(huì)被復(fù)制到其類文件中,也就是說多個(gè)不同的類會(huì)同時(shí)包含相同的方法簽名,同樣地,大量的字符串常量在多個(gè)類文件中也被重復(fù)使用,這些冗余信息會(huì)直接增加文件的體積,同時(shí)也會(huì)嚴(yán)重影響虛擬機(jī)解析文件的效率。dx工具針對這個(gè)問題專門做了處理,它將所有的Java類文件中的常量池進(jìn)行分解,消除其中的冗余信息,重新組合形成一個(gè)常量池,所有的類文件共享一個(gè)常量池。
3.Java虛擬機(jī)與Dalvik虛擬機(jī)架構(gòu)不同。
Java虛擬機(jī)基于棧結(jié)構(gòu),程序在運(yùn)行時(shí)虛擬機(jī)需要頻繁的從棧上讀取或?qū)懭霐?shù)據(jù),這個(gè)過程需要更多的指令分派與內(nèi)存訪問次數(shù),會(huì)耗費(fèi)不少CPU時(shí)間,對于像手機(jī)設(shè)備資源有限的設(shè)備來說,這是相當(dāng)大的一筆開銷。
Dalvil虛擬機(jī)基于寄存器架構(gòu),數(shù)據(jù)的訪問通過寄存器直接傳遞,這樣的訪問方式比基于棧方式要快很多。