博客地址java
Android虛擬機和Java虛擬機之間的區別和聯繫android
Dalvik虛擬機是Google等廠商合做開發的Android移-動設備平臺的核心組成部分之一。編程
它能夠支持已轉換爲.dex(即Dalvik Executable)格式的Java應用程序的運行,.dex格式是專爲Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。(dx 是一套工具,能夠將 Java .class 轉換成 .dex 格式.安全
JVM(Java Virtual Machine) 是一種軟件實現,執行像物理機程序的機器(即電腦)。微信
本來Java被設計基於從物理機器分離實現WORA( 寫一次,隨處運行 )的虛擬機上運行,雖然這個目標已經幾乎被遺忘。jvm
JVM 並非專爲 Java 所實現的運行時,實際上只要有其餘編程語言的編譯器能生成正確 Java bytecode 文件,則這個語言也能實如今JVM上運行。編程語言
所以,JVM 經過執行 Java bytecode 可使 java 代碼在不改變的狀況下運行在各類硬件之上。函數
VM字節碼由.class文件組成,每一個文件一個class。工具
JVM在運行的時候爲每個類裝載字節碼。相反的,Dalvik程序只包含一個.dex文件,這個文件包含了程序中全部的類。
Java編譯器建立了JVM字節碼以後,Dalvik的dx編譯器刪除.class文件,從新把它們編譯成Dalvik字節碼,而後把它們寫進一個.dex文件中。這個過程包括翻譯、重構、解釋程序的基本元素(常量池、類定義、數據段)。
常量池描述了全部的常量,包括引用、方法名、數值常量等。類定義包括了訪問標誌、類名等基本信息。數據段中包含各類被VM執行的函數代碼以及類和函數的相關信息(例如DVM所須要的寄存器數量、局部變量表、操做數堆棧大小),還有實例變量。
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用戶來運行以最大程度地保戶應用程序的安全性和獨立性
Android 4.4發佈了一個ART運行時,準備用來替換掉以前一直使用的Dalvik虛擬機
即Android Runtime
ART 的機制與 Dalvik 不一樣。在Dalvik下,應用每次運行的時候,字節碼都須要經過即時編譯器(just in time ,JIT)轉換爲機器碼,這會拖慢應用的運行效率,而在ART 環境中,應用在第一次安裝的時候,字節碼就會預先編譯成機器碼,使其成爲真正的本地應用。這個過程叫作預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啓動(首次)和執行都會變得更加快速。
如今智能手機大部分均可以讓用戶選擇使用Dalvik仍是ART模式。固然默認仍是使用Dalvik模式。
用法:設置-輔助功能-開發者選項(開發人員工具)-選擇運行環境(不一樣的手機設置的步驟可能不同)。
若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :644196190
微信公衆號:終端研發部