更新時(shí)間:2023-07-06 來(lái)源:黑馬程序員 瀏覽量:
Dalvik是Google公司自己設(shè)計(jì)的用于Android平的虛擬機(jī),它可以簡(jiǎn)單地完成進(jìn)程隔離和線程管理,并且可以提高內(nèi)存的使用效率。每一個(gè)Android應(yīng)用程序在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解析下得以執(zhí)行。
很多人都認(rèn)為Dalvik虛擬機(jī)是一個(gè)Java虛擬機(jī),因?yàn)锳ndroid開發(fā)的編程語(yǔ)言恰恰是Java語(yǔ)言,但是這種說(shuō)法并不準(zhǔn)確。Dalvik虛擬機(jī)并不是按照J(rèn)ava虛擬機(jī)的規(guī)范來(lái)實(shí)現(xiàn)的,兩者不兼容,而且也有很多不同之處。下面通過一個(gè)圖進(jìn)行對(duì)比說(shuō)明,如下所示。
Java 虛擬機(jī)和Dalvik虛擬機(jī)
從圖中可以看出,Java虛擬機(jī)和Dalvik虛擬機(jī)主要有兩大區(qū)別:一是它們編譯后的文件不同;二是它們基于的架構(gòu)不同。具體如下:
1.編譯后的文件不同
Java 虛擬機(jī)運(yùn)行的是.class字節(jié)碼文件,而 Dalvik 虛擬機(jī)運(yùn)行的則是其專有的.dex文件。在Java程序中Java類會(huì)被翻譯成一個(gè)或者多個(gè)字節(jié)碼文件(.class)然后打包到.jar文件,之后Java虛擬機(jī)會(huì)從相應(yīng)的.class文件和.jar文件中獲取相應(yīng)的字節(jié)碼。Android程序雖然也是使用Java語(yǔ)言進(jìn)行編程,但是在翻譯成.class文件后,還會(huì)通過工具將所有的.class文件轉(zhuǎn)換成一個(gè).dex文件,然后Dalvik虛擬機(jī)從其中讀取指令和數(shù)據(jù),最后的.odex是為了在運(yùn)行過程中進(jìn)一步提高性能而對(duì).dex文件進(jìn)行的進(jìn)一步優(yōu)化,能加快軟件的加載速度和開啟速度。
2.基于的架構(gòu)不同
Java虛擬機(jī)是基于棧的架構(gòu),大家知道,棧是一個(gè)連續(xù)的內(nèi)存空間,取出和存入的速度比較慢;而Dalvik是基于寄存器的架構(gòu),寄存器是CPU上的一塊緩存,寄存器的存取速度要比從內(nèi)存中存取的速度快很多,這樣就可以根據(jù)硬件最大限度地優(yōu)化設(shè)備,更適合移動(dòng)設(shè)備的使用。
需要說(shuō)明的是,Android系統(tǒng)下的Dalvik虛擬機(jī)默認(rèn)給每一個(gè)應(yīng)用程序最多分配16 MB內(nèi)存,如果Android加載的資源超過這個(gè)值,就會(huì)報(bào)出OutOfMemoryError異常,因此一定要注意這個(gè)問題。