JVM
JVM是Java Virtual Machine,本質(zhì)上就是一個(gè)軟件,JAVA在編譯后會(huì)生成類(lèi)似于匯編語(yǔ)言的JVM字節(jié)碼(.class文件),與C語(yǔ)言編譯后產(chǎn)生的匯編語(yǔ)言不同的是,C編譯成的匯編語(yǔ)言會(huì)直接在硬件上跑,但JAVA編譯后生成的字節(jié)碼是在JVM上跑,需要由JVM把字節(jié)碼翻譯成機(jī)器指令,才能使JAVA程序跑起來(lái)。JVM的作用是把平臺(tái)無(wú)關(guān)的.class里面的字節(jié)碼翻譯成平臺(tái)相關(guān)的機(jī)器碼,來(lái)實(shí)現(xiàn)跨平臺(tái)。

DVM
DVM就是Dalvik Virtual Machine,是安卓中使用的虛擬機(jī),所有安卓程序都運(yùn)行在安卓系統(tǒng)進(jìn)程里,每個(gè)進(jìn)程對(duì)應(yīng)著一個(gè)Dalvik虛擬機(jī)實(shí)例。

區(qū)別
1.dvm執(zhí)行的是.dex格式文件 jvm執(zhí)行的是.class文件 android程序編譯完之后生產(chǎn).class文件,然后,dex工具會(huì)把.class文件處理成.dex文件,然后把資源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm執(zhí)行的是.class文件。
2.dvm是基于寄存器的虛擬機(jī) 而jvm執(zhí)行是基于虛擬棧的虛擬機(jī)。寄存器存取速度比棧快的多,dvm可以根據(jù)硬件實(shí)現(xiàn)最大的優(yōu)化,比較適合移動(dòng)設(shè)備。
3.class文件存在很多的冗余信息,dex工具會(huì)去除冗余信息,并把所有的.class文件整合到.dex文件中。減少了I/O操作,提高了類(lèi)的查找速度。
ART和DVM
在 Android 中,Java 類(lèi)被轉(zhuǎn)換成 DEX 字節(jié)碼。DEX 字節(jié)碼通過(guò) ART 或者 Dalvik runtime 轉(zhuǎn)換成機(jī)器碼。
重點(diǎn):Dalvik 使用 JIT(Just in time)編譯而 ART 使用 AOT(Ahead of time)編譯。
Just In Time (JIT)
使用 Dalvik JIT 編譯器,每次應(yīng)用在運(yùn)行時(shí),它實(shí)時(shí)的將一部分 Dalvik 字節(jié)碼翻譯成機(jī)器碼。在程序的執(zhí)行過(guò)程中,更多的代碼被被編譯并緩存。由于 JIT 只翻譯一部分代碼,它消耗的更少的內(nèi)存,占用的更少的物理存儲(chǔ)空間。
Ahead Of Time(AOT)
ART 內(nèi)置了一個(gè) Ahead-of-Time 編譯器。在應(yīng)用的安裝期間,他就將 DEX 字節(jié)碼翻譯成機(jī)器碼并存儲(chǔ)在設(shè)備的存儲(chǔ)器上。這個(gè)過(guò)程只在將應(yīng)用安裝到設(shè)備上時(shí)發(fā)生。由于不再需要 JIT 編譯,代碼的執(zhí)行速度要快得多。
總結(jié)
由于 ART 直接運(yùn)行的是應(yīng)用的機(jī)器碼(native execution),它所占用的 CPU 資源要少于 使用 JIT 編譯的 Dalvik。由于占用較少的 CPU 資源也就消耗更少的電池資源。缺點(diǎn)就是更大的存儲(chǔ)空間占用,可能增加10%-20%以及更長(zhǎng)的應(yīng)用安裝時(shí)間,總的來(lái)說(shuō)ART就是“空間換時(shí)間”