兩種虛擬機(jī)的比較—Dalvik VM和JVM
Dalvik虛擬機(jī)是Google公司自主設(shè)計(jì)的運(yùn)行于Android平臺(tái)的Java虛擬機(jī)。JVM是歸Oracle公司所有的,運(yùn)行在基于PC機(jī)上的Window 和Linux操作系上的java虛擬機(jī)。Google工程師之所以設(shè)計(jì)Dalvik虛擬機(jī)主要有以下兩點(diǎn)原因:若要使用JVM需要獲得授權(quán)許可,這意味著需要繳納大量的費(fèi)用;JVM主要是針對(duì)于CPU快,內(nèi)存大的傳統(tǒng)PC機(jī),不適合移動(dòng)設(shè)備。
1. 對(duì)比兩種虛擬機(jī)
Dalvik和JVM兩種不同的虛擬機(jī)比較如下圖1-1所示:
圖1-1兩種虛擬機(jī)的比較
通過(guò)對(duì)比上圖我們可以得出如下幾點(diǎn)區(qū)別:
(1)Java虛擬機(jī)運(yùn)行java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行其專有的文件格式.dex。
(2)為了進(jìn)一步提高運(yùn)行速度,Dalivk虛擬機(jī)可以運(yùn)行八進(jìn)制的文件.Odex。
(3)Dalvik基于寄存器,而JVM基于棧?;诩拇嫫鞯奶摂M機(jī)對(duì)于編譯之后變大的程序來(lái)說(shuō),在它們執(zhí)行時(shí)候,花費(fèi)的時(shí)間更短。
2. 對(duì)比兩種虛擬機(jī)編譯的文件
下圖是兩種不同虛擬機(jī)編譯文件格式的對(duì)比,左圖是JAVA虛擬機(jī)常用的.Class文件,右圖是Dalvik虛擬機(jī)運(yùn)行的.dex文件。下面展示的是.class文件轉(zhuǎn)換為.dex文件的過(guò)程圖,如圖1-2所示。
圖1-2.class文件轉(zhuǎn)換成.dex
JVM的可執(zhí)行文件是.class格式,每一個(gè).java文件經(jīng)過(guò)編譯之后都要生成ClassFile文件。ClassFile文件是由一個(gè)8位的字節(jié)流組成的,每一個(gè)ClassFile都有固定的格式。從左圖可以看出一個(gè).class文件包含的字段:
l Header:頭文件用來(lái)記錄當(dāng)前自解碼的版本以及文件的格式。
l Contant Pool:常量池,存儲(chǔ)常量。例如:Public static final String str =”itcast”便會(huì)存放在常量池中。
l Class:自解碼真正的內(nèi)容,包含filed,Method,Attributes。
傳統(tǒng)的JVM在執(zhí)行代碼時(shí)會(huì)有多個(gè)相同結(jié)構(gòu)的ClassFile文件,Google工程師在編寫Dalvik虛擬機(jī)時(shí)將這些格式相同的ClassFile文件合并成.dex文件,在合并這些文件的同時(shí)對(duì).class文件中都出現(xiàn)的常量進(jìn)行提取并放在常量池(String Constant Pool)中,類常量,字段常量,方法常量也以此類推。這種做法使移動(dòng)平臺(tái)能夠更快的解析各個(gè)文件,提高效率。.odex文件格式是對(duì).dex格式文件的進(jìn)一步優(yōu)化。
本文版權(quán)歸黑馬程序員Android+物聯(lián)網(wǎng)培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!作者:黑馬程序員Android+物聯(lián)網(wǎng)培訓(xùn)學(xué)院首發(fā):http://androi.itheima.com