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

博客地址java

blog.csdn.net/androidstar…linux

Android虛擬機和Java虛擬機之間的區別和聯繫android

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

    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.機器碼佔用的存儲空間更大,字節碼變爲機器碼以後,可能會增長10%-20%(不過在應用包中,可執行的代碼經常只是一部分。好比最新的 Google+ APK 是 28.3 MB,可是代碼只有 6.9 MB。)
    • 2.應用的安裝時間會變長。

tips

  • 如今智能手機大部分均可以讓用戶選擇使用Dalvik仍是ART模式。固然默認仍是使用Dalvik模式。

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

相信本身,沒有作不到的,只有想不到的

若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :644196190
微信公衆號:終端研發部

技術+職場
技術+職場
相關文章
相關標籤/搜索