都是虛擬機(jī),DVM與JVM的區(qū)別在哪兒?
Dalvik虛擬機(jī)(DVM)存在于Android系統(tǒng),JVM是Java虛擬機(jī),兩者都是虛擬機(jī),它們之間有什么區(qū)別呢?
Dalvik虛擬機(jī)是Google等廠商合作開發(fā)的Android移動設(shè)備平臺的核心組成部分之一。它可以支持已轉(zhuǎn)換為.dex(即Dalvik Executable)格式的Java應(yīng)用程序的運(yùn)行,.dex格式是專為Dalvik設(shè)計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。(dx 是一套工具,可以將 Java .class 轉(zhuǎn)換成 .dex 格式. 一個dex檔通常會有多個.class。由于dex有時必須進(jìn)行***化,會使檔案大小增加1-4倍,以O(shè)DEX結(jié)尾。)
1. Dalvik 和標(biāo)準(zhǔn) Java 虛擬機(jī)(JVM)的首要差別
Dalvik 基于寄存器,而 JVM 基于棧?;诩拇嫫鞯奶摂M機(jī)對于更大的程序來說,在它們編譯的時候,花費(fèi)的時間更短。 JVM字節(jié)碼中,局部變量會被放入局部變量表中,繼而被壓入堆棧供操作碼進(jìn)行運(yùn)算,當(dāng)然JVM也可以只使用堆棧而不顯式地將局部變量存入變量表中。Dalvik字節(jié)碼中,局部變量會被賦給65536個可用的寄存器中的任何一個,Dalvik指令直接操作這些寄存器,而不是訪問堆棧中的元素。
2. Dalvik 和 Java 字節(jié)碼的區(qū)別
VM字節(jié)碼由.class文件組成,每個文件一個class。JVM在運(yùn)行的時候為每一個類裝載字節(jié)碼。相反的,Dalvik程序只包含一個.dex文件,這個文件包含了程序中所有的類。Java編譯器創(chuàng)建了JVM字節(jié)碼之后,Dalvik的dx編譯器刪除.class文件,重新把它們編譯成Dalvik字節(jié)碼,然后把它們寫進(jìn)一個.dex文件中。這個過程包括翻譯、重構(gòu)、解釋程序的基本元素(常量池、類定義、數(shù)據(jù)段)。常量池描述了所有的常量,包括引用、方法名、數(shù)值常量等。類定義包括了訪問標(biāo)志、類名等基本信息。數(shù)據(jù)段中包含各種被VM執(zhí)行的函數(shù)代碼以及類和函數(shù)的相關(guān)信息(例如DVM所需要的寄存器數(shù)量、局部變量表、操作數(shù)堆棧大小),還有實例變量。
3. Dalvik 和 Java SDK的SDK不同
4. Dalvik 和 Java 運(yùn)行環(huán)境的區(qū)別
Dalvik 經(jīng)過優(yōu)化,允許在有限的內(nèi)存中同時運(yùn)行多個虛擬機(jī)的實例,并且每一個Dalvik 應(yīng)用作為一個獨(dú)立的Linux 進(jìn)程執(zhí)行。獨(dú)立的進(jìn)程可以防止在虛擬機(jī)崩潰的時候所有程序都被關(guān)閉。
Dalvik虛擬機(jī)在Android2.2之后使用JIT (Just-In-Time)技術(shù),與傳統(tǒng)JVM的JIT并不完全相同。
Dalvik虛擬機(jī)有自己的 bytecode,并非使用 Java bytecode。
其他幾點(diǎn)不同
1. Dalvik主要是完成對象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
2. Dalvik負(fù)責(zé)進(jìn)程隔離和線程管理,每一個Android應(yīng)用在底層都會對應(yīng)一個獨(dú)立的Dalvik虛擬機(jī)實例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。
3. 不同于Java虛擬機(jī)運(yùn)行java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是其專有的文件格式dex。
4. dex文件格式可以減少整體文件尺寸,提高I/O操作的類查找速度。
5. odex是為了在運(yùn)行過程中進(jìn)一步提高性能,對dex文件的進(jìn)一步優(yōu)化。
6. 所有的Android應(yīng)用的線程都對應(yīng)一個Linux線程,虛擬機(jī)因而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制。
7. 有一個特殊的虛擬機(jī)進(jìn)程Zygote,他是虛擬機(jī)實例的孵化器。它在系統(tǒng)啟動的時候就會產(chǎn)生,它會完成虛擬機(jī)的初始化、庫的加載、預(yù)制類庫和初始化的操作。如果系統(tǒng)需要一個新的虛擬機(jī)實例,它會迅速復(fù)制自身,以最快的速度提供給系統(tǒng)。對于一些只讀的系統(tǒng)庫,所有虛擬機(jī)實例都和Zygote共享一塊內(nèi)存區(qū)域。
【本文為51CTO專欄作者“朱國立”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號“開發(fā)者圓桌”獲取聯(lián)系和授權(quán)】