JVM
JVM是Java Virtual Machine,本質上就是一個軟件,JAVA在編譯后會生成類似于匯編語言的JVM字節碼(.class文件),與C語言編譯后產生的匯編語言不同的是,C編譯成的匯編語言會直接在硬件上跑,但JAVA編譯后生成的字節碼是在JVM上跑,需要由JVM把字節碼翻譯成機器指令,才能使JAVA程序跑起來。JVM的作用是把平臺無關的.class里面的字節碼翻譯成平臺相關的機器碼,來實現跨平臺。
DVM
DVM就是Dalvik Virtual Machine,是安卓中使用的虛擬機,所有安卓程序都運行在安卓系統進程里,每個進程對應著一個Dalvik虛擬機實例。
區別
1.dvm執行的是.dex格式文件 jvm執行的是.class文件 android程序編譯完之后生產.class文件,然后,dex工具會把.class文件處理成.dex文件,然后把資源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm執行的是.class文件。
2.dvm是基于寄存器的虛擬機 而jvm執行是基于虛擬棧的虛擬機。寄存器存取速度比??斓亩啵琩vm可以根據硬件實現最大的優化,比較適合移動設備
。
3.class文件存在很多的冗余信息,dex工具會去除冗余信息,并把所有的.class文件整合到.dex文件中。減少了I/O操作,提高了類的查找速度。
ART和DVM
在 Android 中,Java 類被轉換成 DEX 字節碼。DEX 字節碼通過 ART 或者 Dalvik runtime 轉換成機器碼。
重點:Dalvik 使用 JIT(Just in time)編譯而 ART 使用 AOT(Ahead of time)編譯。
Just In Time (JIT)
使用 Dalvik JIT 編譯器,每次應用在運行時,它實時的將一部分 Dalvik 字節碼翻譯成機器碼。在程序的執行過程中,更多的代碼被被編譯并緩存。由于 JIT 只翻譯一部分代碼,它消耗的更少的內存,占用的更少的物理存儲空間。
Ahead Of Time(AOT)
ART 內置了一個 Ahead-of-Time 編譯器。在應用的安裝期間,他就將 DEX 字節碼翻譯成機器碼并存儲在設備的存儲器上。這個過程只在將應用安裝到設備上時發生。由于不再需要 JIT 編譯,代碼的執行速度要快得多。
總結
由于 ART 直接運行的是應用的機器碼(native execution),它所占用的 CPU 資源要少于 使用 JIT 編譯的 Dalvik。由于占用較少的 CPU 資源也就消耗更少的電池資源。缺點就是更大的存儲空間占用,可能增加10%-20%以及更長的應用安裝時間,總的來說ART就是“空間換時間”