參考 http://zhidao.baidu.com/link?url=QSBPc9CmZF34l98BGnC_TrcFrRljHsb8vej9ravk2cGiiXZd9n1Kw95pzXHoSc4SoPZIhiPYdKJe6dP_wzfLKa
參考 http://www.it165.net/pro/html/201403/11158.html
Dalvik 和標準Java 虛擬機(JVM)首要差別 Dalvik 基於寄存器,而 JVM 基於棧。基於寄存器的虛擬機對於更大的程序來說,在它們編譯的時候,花費的時間更短。 Dalvik 和Java 運行環境的區別 1:Dalvik主要是完成對象生命週期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。 2:Dalvik負責進程隔離和線程管理,每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。 3:不同於Java虛擬機運行java字節碼,Dalvik虛擬機運行的是其專有的文件格式Dex 4:dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度。 5:odex是爲了在運行過程中進一步提高性能,對dex文件的進一步優化。 6:所有的Android應用的線程都對應一個Linux線程,虛擬機因而可以更多的依賴操作系統的線程調度和管理機制 7:有一個特殊的虛擬機進程Zygote,他是虛擬機實例的孵化器。它在系統啓動的時候就會產生,它會完成虛擬機的初始化,庫的加載,預製類庫和初始化的操作。如果系統需要一個新的虛擬機實例,它會迅速複製自身,以最快的數據提供給系統。對於一些只讀的系統庫,所有虛擬機實例都和Zygote共享一塊內存區域。 8:Dalvik是由Dan Bornstein編寫的,名字來源於他的祖先曾經居住過名叫Dalvík的小漁村,村子位於冰島。
-
在Android的體系框架中有一部分叫做Android Runtime,即Android運行時環境,這個環境包括了兩個部分,一個是Android的核心類庫,還有一個就是Dalvik虛擬機了。
Android之所以開發Dalvik虛擬機而不使用JAVA自帶的JVM是出於以下兩點考慮(個人認爲,不代表廣泛意義):
1.版權問題,如果使用JVM就涉及到了版權問題,所以google需要在JVM的基礎上做一些改進,創造自己的虛擬機。
2.性能問題。當然jvm虛擬機對Java開發來說性能已經足夠了,但是相對移動平臺的特性,比如低內存,低電量等,就顯得有些牽強了,所以爲了優化虛擬機的工作效率,google開發了android自己的虛擬機。
如上圖所示,jvm是吧.java文本編譯成.class字節碼文件,在執行java程序的時候,類加載器把需要的類全部加載到內存當中去。
上圖展示的是把字節碼文件載入到內存後的結構,每個Class文件被解析成了幾部分,包括了Header(主要是jdk的版本等)、常量等。。。
有多少個類,就會在內存中產生多少個上圖結構中的文件。
上圖所示是dalvik虛擬機加載的類文件結構圖。davik虛擬機把.java文件編譯成.class文件,又把.class文件轉換成.dex文件,dalvik來執行.dex文件。
實際上.dex文件就是把多個class文件中的常量、方法等放到一起。形成如上圖所示的結構。
在架構上jvm是基於棧的架構,所以每次訪問數據cpu都要到內存中取到數據。
而dalvik是基於寄存器的架構。寄存器是在cpu上的一塊存儲空間,cpu如果直接從寄存器上讀取數據的話就會快很多。