ART與Dalvik、JVM之間的關係你懂了嗎?

認識瞭解虛擬機

JVM

JVM是 java虛擬機,是實現java誇平臺的主要方式,可以使得java這樣的高級語言編譯成機器可以識別的機器語言,讓java 可以一次編譯,到處運行。
運行文件格式:.class文件,基於棧

Dalvik

Dalvik 是Android系統在上面運行的虛擬機DVM,Dalvik虛擬機是專門爲移動設備定製的,它允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik應用都是一個獨立的Linux進程。獨立的進程可以防止虛擬機崩潰的時所有進程都被關閉。Dalvik 是一個基於 JIT(Just in time)編譯的引擎。
【補充】:Dalvik是Google公司與其他廠商合作開發設計用於Android平臺的虛擬機,是Android移動設備平臺的核心組成部分之一。
運行文件格式:.dex格式的Java應用程序,基於寄存器

ART

ART 是 Android 上的應用和部分系統服務使用的託管式運行時環境(Android Runtime),安卓4.4 KitKat之後推出ART,從Android 5.0 Lollipop開始,默認ART替換了Dalvik虛擬機,同時ART也完全兼容Dalvik。該虛擬機採用的是AOT(Ahead of time)編譯,7.0後系統採用的是結合使用 AOT、即時 (JIT) 編譯和配置文件引導型編譯,一種混合模式。
運行文件格式:.dex格式的Java應用程序,基於寄存器

即時編譯器(Just In Time,JIT)

DVM中的應用每次運行時,通過JIT實時的將一部分 Dalvik 字節碼翻譯成機器碼(native execution) ,在程序的執行中.dex不斷被編譯並提前緩存。
優點:消耗的更少的內存,佔用的更少的物理存儲空間
缺點:使應用的運行效率降低

預先編譯器(Ahead-Of Time,AOT)

ART系統在**第一次安裝應用(只發生在應用安裝)時會進行一次預編譯(Ahead Of Time,AOT),將.dex字節碼文件預先編譯成機器碼(native execution)**並存在本地,這樣應用每次運行時就不需要再執行編譯了,能大大提高運行效率。
優點: 1. 佔用較少的CPU資源,消耗更少的電量 ;2. 減少啓動時間;3不用即時翻譯,可省電 ;4:改善垃圾回收器;5. 應用運行更快,直接執行機器碼,.dex文件已經在安裝時翻譯好了
缺點:1. 安裝時需要AOT,安裝時間更久; 2. 需要額外的空間存儲編譯的機器碼

相關術語

.dex文件

.dex格式是專爲Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。

在Android中,.java被編譯成.class文件後,多個class文件會被相關工具打包成class.dex放在apk中。比如Android studio用SDK的dx命令可以打包指定的.class爲.dex。

彙編器

它直接將彙編語言翻譯成機器碼,所以它的速度非常快。

編譯器

它將源碼翻譯成彙編語言,然後再用匯編器轉換成機器碼。這種方式編譯過程很慢但是執行速度很快。但是使用編譯器最大的問題是編譯出來的機器碼依賴於特定的平臺。換句話說,在一臺機器上可以運行的代碼在另一臺不同的機器上可能就無法運行。

解釋器

它在執行程序時才翻譯代碼。由於代碼翻譯是在執行階段才發生,所以執行速度很慢。

Multidex

在android5.0之前,每個android應用只含有一個dex文件,dex的方法數量被限制在了65535之內,導致apk引入大量第三方sdk後方法數量超過限制無法編譯通過。爲了解決這個問題,Google推出多dex文件的解決方案multidex,一個apk可以包含多個dex文件。通過Multidex.install(this)完成dex文件的加載。

Android4.4時開始引入ART,在5.0以後終端默認虛擬機選擇ART,ART是支持多個.dex文件的。

補充說明

ART對Dalvik的兼容

ART使用設備自帶的dex2oat工具來編譯應用。此工具將dex文件編譯爲應用可執行文件。 但是一些後處理工具會生成無效文件,Dalvik可以接受這些文件,但是ART無法編譯這些文件。所以ART只是基本上兼容Dalvik,不是不完全。

ART對垃圾回收的優化措施

  1. 只有一次(而非兩次)GC 暫停
  2. 在 GC 保持暫停狀態期間並行處理
  3. 在清理最近分配的短時對象這種特殊情況中,回收器的總 GC 時間更短
  4. 優化了垃圾回收的工效,能夠更加及時地進行並行垃圾回收,這使得 GC_FOR_ALLOC 事件在典型用例中極爲罕見
  5. 壓縮 GC 以減少後臺內存使用和碎片

Android 爲什麼要使用虛擬機?

Android 使用虛擬機作爲其運行環境是爲了運行 APK 文件構成的 Android 應用。

  1. 應用代碼和核心的操作系統分離。所以即使任意一個程序中包含惡意的代碼也不會直接影響系統文件。這使得 Android 操作系統更穩定可靠。
  2. 它提高了跨平臺兼容性或者說平臺獨立性。這意味着即使某一個應用是在 PC 上編譯的,它也可以通過虛擬機在移動平臺上執行。

Dalvik與JVM的比較

  1. Dalvik佔用更少的空間;
  2. 爲簡化翻譯,常量池只使用32位索引;3.標準Java字節碼實行8位堆棧指令,Dalvik使用16位指令集直接作用於局部變量。局部變量通常來自4位的“虛擬寄存器”區。這樣減少了Dalvik的指令計數,提高了翻譯速度。
  3. 一般來說,基於堆棧的機器必須使用指令才能從堆棧上的加載和操作數據,因此,相對基於寄存器的機器,它們需要更多的指令才能實現相同的性能。但是基於寄存器機器上的指令必須經過編碼,因此,它們的指令往往更大。
  4. Dalvik虛擬機既不支持Java SE 也不支持Java ME類庫(如:Java類,AWT和Swing都不支持)。 相反,它使用自己建立的類庫(Apache Harmony Java的一個子集)。

Dalvik的部分機制原理

  1. 當Android啓動時,Dalvik VM 監視所有的程序(APK),並且創建依存關係樹,爲每個程序優化代碼並存儲在Dalvik緩存中。Dalvik第一次加載後會生成Cache文件,以提供下次快速加載,所以第一次打開程序會很慢。
  2. Dalvik解釋器採用預先算好的Goto地址,每個指令對內存的訪問都在64字節邊界上對齊。這樣可以節省一個指令後進行查表的時間。爲了強化功能, Dalvik還提供了快速翻譯器(Fast Interpreter)。

Android 7.0之後採用解釋、JIT、AOT混合執行方案

在Android N 中對其 ART做了比較大的變化。主要是同一程序的代碼可能同時運行在本地機器碼(編譯)、解釋和JIT(Just In Time)的混合運行模式,並且不同的用戶,同一應用程序的代碼,可能運行不同的編譯代碼。因爲有了Profile-guided JIT/AOT Compilation,那麼不同的用戶行爲對同一app可能會有不同的編譯結果。N 上做此變化的其目的是爲了在安裝時間、內存佔用、電池消耗和性能之間獲得最好的折衷。

**新的方案即是:**當設備idle和充電的時候,ART會執行鍼對“熱代碼”進行AOT編譯,其他代碼不做編譯。爲了得到更優的代碼,ART採用了幾種技巧包括深度內聯。
對同一個應用可以編譯數次,或者找到變“熱”的代碼路徑或者對已經編譯的代碼進行新的優化,這取決於分析器在隨後的執行中的分析數據。
這種混合使用AOT、解釋、JIT的策略相比於單純的AOT或JIT有如下優點:

  1. 即使是大應用,安裝時間也能縮短到幾秒
  2. 系統升級能更快地安裝,因爲不再需要優化這一步
  3. 應用的內存佔用更小,有些情況下可以降低50%
  4. 改善了性能,更低的電池消耗

JVM、DVM、ART對比示意圖

`圖片參考唐先僧

請添加圖片描述

該篇博客純屬個人觀點和見解,如有錯誤懇請留言指正,萬分感激!請添加圖片描述
該篇博客純屬個人觀點和見解,如有錯誤懇請留言指正,萬分感激!
參考鏈接:
https://www.jianshu.com/p/bdb6c29aca83

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章