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