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