一篇文章告訴你Dalvik 和JVM的區別

codeGoogle發表於2019-03-04

部落格地址

blog.csdn.net/androidstar…

Android虛擬機器和Java虛擬機器之間的區別和聯絡

Dalvik

  • Dalvik虛擬機器是Google等廠商合作開發的Android移-動裝置平臺的核心組成部分之一。

  • 它可以支援已轉換為.dex(即Dalvik Executable)格式的Java應用程式的執行,.dex格式是專為Dalvik設計的一種壓縮格式,適合記憶體和處理器速度有限的系統。(dx 是一套工具,可以將 Java .class 轉換成 .dex 格式.

  • 一個dex檔通常會有多個.class。由於dex有時必須進行最佳化,會使檔案大小增加1-4倍,以ODEX結尾。)   

JVM

  • JVM(Java Virtual Machine) 是一種軟體實現,執行像物理機程式的機器(即電腦)。

  • 原本Java被設計基於從物理機器分離實現WORA( 寫一次,隨處執行 )的虛擬機器上執行,雖然這個目標已經幾乎被遺忘。

    JVM 並不是專為 Java 所實現的執行時,實際上只要有其他程式語言的編譯器能生成正確 Java bytecode 檔案,則這個語言也能實現在JVM上執行。

    因此,JVM 通過執行 Java bytecode 可以使 java 程式碼在不改變的情況下執行在各種硬體之上。

Java虛擬機器結構
Java虛擬機器結構

DVM的執行機制
DVM的執行機制

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

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

DVM如何執行java

  • VM位元組碼由.class檔案組成,每個檔案一個class。

  • JVM在執行的時候為每一個類裝載位元組碼。相反的,Dalvik程式只包含一個.dex檔案,這個檔案包含了程式中所有的類。

  • Java編譯器建立了JVM位元組碼之後,Dalvik的dx編譯器刪除.class檔案,重新把它們編譯成Dalvik位元組碼,然後把它們寫進一個.dex檔案中。這個過程包括翻譯、重構、解釋程式的基本元素(常量池、類定義、資料段)。

    常量池描述了所有的常量,包括引用、方法名、數值常量等。類定義包括了訪問標誌、類名等基本資訊。資料段中包含各種被VM執行的函式程式碼以及類和函式的相關資訊(例如DVM所需要的暫存器數量、區域性變數表、運算元堆疊大小),還有例項變數。

Dalvik 和 Java SDK的SDK不同。

  • JDK(Java Develop Toolkit),就是針對JAVA語言的SDK。
  • sdk 是 software development kit 是Android 軟體開發工具

DVM和JVM
DVM和JVM

Dalvik 和 Java 執行環境的區別    

  • Dalvik 經過優化,允許在有限的記憶體中同時執行多個虛擬機器的例項,並且每一個Dalvik 應用作為一個獨立的Linux 程式執行。獨立的程式可以防止在虛擬機器崩潰的時候所有程式都被關閉。

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

  • Dalvik虛擬機器有自己的 bytecode,並非使用 java bytecode。

  • Dalvik主要是完成物件生命週期管理,堆疊管理,執行緒管理,安全和異常管理,以及垃圾回收等等重要功能。   

  • Dalvik負責程式隔離和執行緒管理,每一個android應用在底層都會對應一個獨立的Dalvik虛擬機器例項,其程式碼在虛擬機器的解釋下得以執行。   

  • 不同於Java虛擬機器執行java位元組碼,Dalvik虛擬機器執行的是其專有的檔案格式Dex。   

  • dex檔案格式可以減少整體檔案尺寸,提高I/O操作的類查詢速度。   

  • odex是為了在執行過程中進一步提高效能,對dex檔案的進一步優化。   

  • 所有的Android應用的執行緒都對應一個linux執行緒,虛擬機器因而可以更多的依賴作業系統的執行緒排程和管理機制。   

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

  • 基於暫存器,基於暫存器的虛擬機器雖然比基於堆疊的虛擬機器在硬體,通用性上要差一些,但是它的程式碼執行效率去更好

  • 每一個Android應用都執行在它自己的DVM例項中,每一個DVM例項都是一個獨立的程式空間。所有的Android應用的執行緒都對應一個Linux執行緒,DVM因此可以更多地依賴作業系統的執行緒排程和管理機制。不同的應用在不同的程式空間裡執行,不同的應用都是用不同的Linux使用者來執行以最大程度地保戶應用程式的安全性和獨立性

Art虛擬機器

Android 4.4釋出了一個ART執行時,準備用來替換掉之前一直使用的Dalvik虛擬機器

  • 即Android Runtime

    ART 的機制與 Dalvik 不同。在Dalvik下,應用每次執行的時候,位元組碼都需要通過即時編譯器(just in time ,JIT)轉換為機器碼,這會拖慢應用的執行效率,而在ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動(首次)和執行都會變得更加快速。

    ART有什麼優缺點呢?

  • 優點:
    • 1、系統效能的顯著提升。
    • 2、應用啟動更快、執行更快、體驗更流暢、觸感反饋更及時。
    • 3、更長的電池續航能力。
    • 4、支援更低的硬體。
  • 缺點:
    • 1.機器碼佔用的儲存空間更大,位元組碼變為機器碼之後,可能會增加10%-20%(不過在應用包中,可執行的程式碼常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是程式碼只有 6.9 MB。)
    • 2.應用的安裝時間會變長。

tips

  • 現在智慧手機大部分都可以讓使用者選擇使用Dalvik還是ART模式。當然預設還是使用Dalvik模式。

  • 用法:設定-輔助功能-開發者選項(開發人員工具)-選擇執行環境(不同的手機設定的步驟可能不一樣)。

相信自己,沒有做不到的,只有想不到的

如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :644196190
微信公眾號:終端研發部

技術+職場
技術+職場

相關文章