兩種虛擬機的比較—Dalvik VM和JVM
Dalvik虛擬機是Google公司自主設(shè)計的運行于Android平臺的Java虛擬機。JVM是歸Oracle公司所有的,運行在基于PC機上的Window 和Linux操作系上的java虛擬機。Google工程師之所以設(shè)計Dalvik虛擬機主要有以下兩點原因:若要使用JVM需要獲得授權(quán)許可,這意味著需要繳納大量的費用;JVM主要是針對于CPU快,內(nèi)存大的傳統(tǒng)PC機,不適合移動設(shè)備。
1. 對比兩種虛擬機
Dalvik和JVM兩種不同的虛擬機比較如下圖1-1所示:
圖1-1兩種虛擬機的比較
通過對比上圖我們可以得出如下幾點區(qū)別:
(1)Java虛擬機運行java字節(jié)碼,Dalvik虛擬機運行其專有的文件格式.dex。
(2)為了進一步提高運行速度,Dalivk虛擬機可以運行八進制的文件.Odex。
(3)Dalvik基于寄存器,而JVM基于棧。基于寄存器的虛擬機對于編譯之后變大的程序來說,在它們執(zhí)行時候,花費的時間更短。
2. 對比兩種虛擬機編譯的文件
下圖是兩種不同虛擬機編譯文件格式的對比,左圖是JAVA虛擬機常用的.Class文件,右圖是Dalvik虛擬機運行的.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:頭文件用來記錄當前自解碼的版本以及文件的格式。
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虛擬機時將這些格式相同的ClassFile文件合并成.dex文件,在合并這些文件的同時對.class文件中都出現(xiàn)的常量進行提取并放在常量池(String Constant Pool)中,類常量,字段常量,方法常量也以此類推。這種做法使移動平臺能夠更快的解析各個文件,提高效率。.odex文件格式是對.dex格式文件的進一步優(yōu)化。
本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/android/