天天看點

java虛拟機和Dalvik虛拟機的差別

Google于2007年底正式釋出了Android SDK, 作為 Android系統的重要特性,Dalvik虛拟機也第一次進入了人們的視野。它對記憶體的高效使用,和在低速CPU上表現出的高性能,确實令人刮目相看。 依賴于底層Posix相容的作業系統,它可以簡單的完成程序隔離和線程管理。每一個Android應用在底層都會對應一個獨立的Dalvik虛拟機執行個體, 其代碼在虛拟機的解釋下得以執行。

很多人認為Dalvik虛拟機是一個Java虛拟機,因為Android的程式設計語言恰恰就是Java語言。但是這種說法并不準确,因為Dalvik虛拟機并不是按照Java虛拟機的規範來實作的,兩者并不相容;同時還要兩個明顯的不同:

Java虛拟機運作的是Java位元組碼,而Dalvik虛拟機運作的則是其專有的檔案格式DEX(Dalvik Executable)。

在Java SE程式中的Java類會被編譯成一個或者多個位元組碼檔案(.class)然後打包到JAR檔案,而後Java虛拟機會從相應的CLASS檔案和JAR文 件中擷取相應的位元組碼;Android應用雖然也是使用Java語言進行程式設計,但是在編譯成CLASS檔案後,還會通過一個工具(dx)将應用所有的 CLASS檔案轉換成一個DEX檔案,而後Dalvik虛拟機會從其中讀取指令和資料。

Dalvik和Android系統Android作為新一代的基于Linux的開源手機作業系統,其系統架構由下而上可以分為以下幾部分:

Linux核心

本地庫

Android運作庫

應用架構

應用

java虛拟機和Dalvik虛拟機的差別:

java虛拟機

Dalvik虛拟機

java虛拟機基于棧。 基于棧的機器必須使用指令來載入和操作棧上資料,所需指令更多更多

dalvik虛拟機是基于寄存器的

java虛拟機運作的是java位元組碼。(java類會被編譯成一個或多個位元組碼.class檔案,打包到.jar檔案中,java虛拟機從相應的.class檔案和.jar檔案中擷取相應的位元組碼)

Dalvik運作的是自定義的.dex位元組碼格式。(java類被編譯成.class檔案後,會通過一個dx工具将所有的.class檔案轉換成一個.dex檔案,然後dalvik虛拟機會從其中讀取指令和資料)

常量池已被修改為隻使用32位的索引,以 簡化解釋器。dalvik的堆和棧的參數可以通過-Xms和-Xmx更改

一個應用,一個虛拟機執行個體,一個程序(所有android應用的線程都是對應一個linux線程,都運作在自己的沙盒中,不同的應用在不同的程序中運作。每個android dalvik應用程式都被賦予了一個獨立的linux PID(app_*))

Dalvik和标準Java虛拟機(JVM)之間的首要差别之一,就是Dalvik基于寄存器,而JVM基于棧。

Dalvik和Java之間的另外一大差別就是運作環境——Dalvik經過優化,允許在有限的記憶體中同時運作多個虛拟機的執行個體,并且每一個 Dalvik應用作為一個獨立的Linux程序執行。

(1)虛拟機很小,使用的空間也小;

(2)Dalvik沒有JIT編譯器;

(3)常量池已被修改為隻使用32位的索引,以簡化解釋器;

(4)它使用自己的位元組碼,而非Java位元組碼。

Dalvik虛拟機架構:

在android源碼中,Dalvik虛拟機的實作位于“dalvik/”目錄下,其中“dalvik/vm”是虛拟機的實作部分,将會編譯成libdvm.so;而"dalvik/libdex"将會編譯成libdex.a靜态庫作為dex工具;“dalvik/dexdump”是.dex檔案的反編譯工具;虛拟機的可執行程式位于“dalvik/dalvikvm”中,将會編譯成dalvikvm可執行檔案。

 dalvik虛拟機架構:

Android應用編譯及運作流程:

Dalvik程序管理:

        dalvik程序管理是依賴于linux的程序體系結構的,如要為應用程式建立一個程序,它會使用linux的fork機制來複制一個程序(複制程序往往比建立程序效率更高)。

Zygote是一個虛拟機程序,同時也是一個虛拟機執行個體的孵化器,它通過init程序啟動。首先會孵化出System_Server(android絕大多系統服務的守護程序,它會監聽socket等待請求指令,當有一個應用程式啟動時,就會向它送出請求,zygote就會FORK出一個新的應用程式程序).每當系統要求執行一個android應用程式時,Zygote就會運用linux的FORK進制産生一個子程序來執行該應用程式。

JVM和Dalvik程序管理:

linux中程序間通信的方式有很多,但是dalvik使用的是信号方式來完成程序間通信。

Android的初始化流程:

繼續閱讀