Android平臺體系結構中的虛擬機與JAVA中的虛擬機有什麼不同

參考  http://zhidao.baidu.com/link?url=QSBPc9CmZF34l98BGnC_TrcFrRljHsb8vej9ravk2cGiiXZd9n1Kw95pzXHoSc4SoPZIhiPYdKJe6dP_wzfLKa



參考 http://www.it165.net/pro/html/201403/11158.html


Android平臺體系結構中的虛擬機與JAVA中的虛擬機有什麼不同

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如果直接從寄存器上讀取數據的話就會快很多。





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