尚學堂【官網】-西安Java培訓|c++培訓|Android培訓|安卓培訓|java視頻教程|軟件工程師|-西安雁塔尚學堂計算機學校
Android培訓/西安Android培訓  尚學堂首頁Java學院Android培訓/西安Android培訓

Android DVM和Java JVM以及ART概述西安Java培訓

www.zyopwk.live 發布人:java  |  來自:本站  |  發布時間:2017-10-31 15:23:11  |  點擊次數:1622

JVM,Java Virtual Machine,Java虛擬機,JVM是基于棧的虛擬機,JVM棧是內存中連續的存儲空間。JVM優點是相對簡單,實現了Java的跨平臺。Android使用Java編程設計語言,DVM(Dalvik Virtual Machine )作為其虛擬機,Android App運行在系統進程里,每個進程對應著一個Dalvik虛擬機實例。


一個Android應用啟動后運行在一個單獨的Dalvik VM中,每一個Dalvik VM運行在一個單獨的Linux進程中。Dalvik VM可在有限內存空間中同時運行多個Dalvik虛擬機實例。因此每一個Android應用作為一個獨立的Linux 進程執行,作為安全隔離,該獨立進程可以防止在Dalvik虛擬機崩潰時導致所有Android程序都被影響。 


Dalvik虛擬機在Android 2.2之后使用JIT (Just-In-Time)技術,與傳統JVM的JIT并不完全一致。每一個Android應用在系統底層都會對應一個獨立的DVM實例,其代碼在虛擬機的解釋下執行。Android應用的線程對應一個Linux線程,Dalvik虛擬機因此可以使用Linux操作系統內核的線程調度和管理機制。


Android DVM執行的是.dex文件(Dalvik Executable,以ODEX結尾),dex是專為Dalvik VM設計的一種文件壓縮格式。Dalvik虛擬機有自己的 ByteCode,并非使用Java ByteCode。Java JVM執行.class字節碼文件。

對比Java的.jar和Android的.dex產生過程:


Java:
.java  --  .class  -- .jar


Android:
.java  --  .class  -- .dex


可以簡單認為dex是若干class等Android資源的“歸整”。多個class文件合并成一個dex文件所帶來的問題,是方法數量超過65535編譯錯誤,解決方案是MultiDex。


DVM是基于寄存器的虛擬機,JVM是基于棧的虛擬機。基于寄存器的DVM編譯和運行時存取速度比棧快,DVM適合移動設備。JVM基于棧結構,代碼在編譯和運行時虛擬機須頻繁從棧讀寫數據,此過程需要額外多的指令與內存訪問,顯然DVM速度更快。


DVM在GC時單獨申請一塊內存空間,以位圖Bitmap形式來保存堆上對象的標記,GC結束后就釋放該空間。 DVM GC策略默認是標記擦除垃圾回收算法,即Mark和Sweep兩個階段。Mark階段使用兩個Bitmap來描述堆的對象,一個為Live Bitmap,另一個Mark Bitmap。Live Bitmap標記上一次GC時被引用的對象,也就是沒有被回收的對象,Mark Bitmap用來標記當前GC有被引用的對象。


Android 4.4發布ART(Android RunTime)。Android L后,ART取代DVM。ART虛擬機直接執行本地機器碼。DVM運行的dex字節碼需要通過解釋器執行。作為兼容性考慮,ART環境下,Android應用程序仍然可以是一個包含dex的apk文件。

在ART中,apk運行前,先對apk中的dex字節碼進行解釋翻譯,取得到對應的本地Android機器指令,然后就可以在ART中直接執行。ART在安裝apk(Android App)時就把dex中字節碼隨即編譯成本地機器碼,之后每次啟動App,執行的即是本地機器碼(類似于Windows下的exe文件)。ART省去了運行時解釋執行,效率更高,速度更快。

尚學堂微信公眾號3.png

當前文: Android DVM和Java JVM以及ART概述西安Java培訓
上一頁:沒有了
下一頁:學安卓要先學會JAVA嗎?
在線報名(*為必填項)
云南快乐十分开奖走势图