Dalvik VM (DVM) 與Java VM (JVM)之間有哪些區別


Dalvik虛擬機是Google等廠商合作開發的Android移動設備平臺的核心組成部分之一。它可以支持已轉換爲.dex(即Dalvik Executable)格式的Java應用程序的運行,.dex格式是專爲Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。(dx 是一套工具,可以將 Java .class 轉換成 .dex 格式. 一個dex檔通常會有多個.class。由於dex有時必須進行最佳化,會使檔案大小增加1-4倍,以ODEX結尾。)   

       1、Dalvik 和標準 Java 虛擬機(JVM)的首要差別

       Dalvik 基於寄存器,而 JVM 基於棧。基於寄存器的虛擬機對於更大的程序來說,在它們編譯的時候,花費的時間更短。 JVM字節碼中,局部變量會被放入局部變量表中,繼而被壓入堆棧供操作碼進行運算,當然JVM也可以只使用堆棧而不顯式地將局部變量存入變量表中。Dalvik字節碼中,局部變量會被賦給65536個可用的寄存器中的任何一個,Dalvik指令直接操作這些寄存器,而不是訪問堆棧中的元素。

       2、Dalvik 和 Java 字節碼的區別

       VM字節碼由.class文件組成,每個文件一個class。JVM在運行的時候爲每一個類裝載字節碼。相反的,Dalvik程序只包含一個.dex文件,這個文件包含了程序中所有的類。Java編譯器創建了JVM字節碼之後,Dalvik的dx編譯器刪除.class文件,重新把它們編譯成Dalvik字節碼,然後把它們寫進一個.dex文件中。這個過程包括翻譯、重構、解釋程序的基本元素(常量池、類定義、數據段)。常量池描述了所有的常量,包括引用、方法名、數值常量等。類定義包括了訪問標誌、類名等基本信息。數據段中包含各種被VM執行的函數代碼以及類和函數的相關信息(例如DVM所需要的寄存器數量、局部變量表、操作數堆棧大小),還有實例變量。


       3、Dalvik 和 Java SDK的SDK不同。

       4、Dalvik 和 Java 運行環境的區別    

       Dalvik 經過優化,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik 應用作爲一個獨立的Linux 進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。

       Dalvik虛擬機在android2.2之後使用JIT (Just-In-Time)技術,與傳統JVM的JIT並不完全相同, 

       Dalvik虛擬機有自己的 bytecode,並非使用 Java bytecode。

       還有以下幾點:

       1、Dalvik主要是完成對象生命週期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。   

       2、Dalvik負責進程隔離和線程管理,每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。   

       3、不同於Java虛擬機運行java字節碼,Dalvik虛擬機運行的是其專有的文件格式Dex。   

       4、dex文件格式可以減少整體文件尺寸,提高I/O操作的類查找速度。   

       5、odex是爲了在運行過程中進一步提高性能,對dex文件的進一步優化。   

       6、所有的Android應用的線程都對應一個Linux線程,虛擬機因而可以更多的依賴操作系統的線程調度和管理機制。   

       7、有一個特殊的虛擬機進程Zygote,他是虛擬機實例的孵化器。它在系統啓動的時候就會產生,它會完成虛擬機的初始化、庫的加載、預製類庫和初始化的操作。如果系統需要一個新的虛擬機實例,它會迅速複製自身,以最快的速度提供給系統。對於一些只讀的系統庫,所有虛擬機實例都和Zygote共享一塊內存區域。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章