部落格地址
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 程式碼在不改變的情況下執行在各種硬體之上。
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 軟體開發工具
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
微信公眾號:終端研發部