1. 程式人生 > >java虛擬機器和Dalvik虛擬機器的區別

java虛擬機器和Dalvik虛擬機器的區別

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虛擬機器的區別:

Dalvik虛擬機器 java虛擬機器
dalvik虛擬機器是基於暫存器的 java虛擬機器基於棧。 基於棧的機器必須使用指令來載入和操作棧上資料,所需指令更多更多
Dalvik執行的是自定義的.dex位元組碼格式。(java類被編譯成.class檔案後,會通過一個dx工具將所有的.class檔案轉換成一個.dex檔案,然後dalvik虛擬機器會從其中讀取指令和資料 java虛擬機器執行的是java位元組碼。(java類會被編譯成一個或多個位元組碼.class檔案,打包到.jar檔案中,java虛擬機器從相應的.class檔案和.jar檔案中獲取相應的位元組碼)
常量池已被修改為只使用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程序管理:

inux中程序間通訊的方式有很多,但是dalvik使用的是訊號方式來完成程序間通訊。

Android的初始化流程:

在這裡插入圖片描述

歡迎大家加入粉絲群:963944895,群內免費分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務、Dubbo框架、Redis快取、RabbitMq訊息、JVM調優、Tomcat容器、MySQL資料庫教學視訊及架構學習思維導圖