JAVA虛擬機、Dalvik虛擬機和ART虛擬機簡要對比

1、什么是JVM?

JVM本質上就是一個軟件,是計算機硬件的一層軟件抽象,在這之上才能夠運行Java程序,JAVA在編譯后會生成類似于匯編語言的JVM字節碼,與C語言編譯后產生的匯編語言不同的是,C編譯成的匯編語言會直接在硬件上跑,但JAVA編譯后生成的字節碼是在JVM上跑,需要由JVM把字節碼翻譯成機器指令,才能使JAVA程序跑起來。
JVM運行在操作系統上,屏蔽了底層實現的差異,從而有了JAVA吹噓的平臺獨立性和Write Once Run Anywhere。根據JVM規范實現的具體虛擬機有幾十種,主流的JVM包括Hotspot、Jikes RVM等,都是用C/C++和匯編編寫的,每個JRE編譯的時候針對每個平臺編譯,因此下載JRE(JVM、Java核心類庫和支持文件)的時候是分平臺的,JVM的作用是把平臺無關的.class里面的字節碼翻譯成平臺相關的機器碼,來實現跨平臺。

2、什么是DVM,和JVM有什么不同?

JVM是Java Virtual Machine,而DVM就是Dalvik Virtual Machine,是安卓中使用的虛擬機,所有安卓程序都運行在安卓系統進程里,每個進程對應著一個Dalvik虛擬機實例。他們都提供了對象生命周期管理、堆棧管理、線程管理、安全和異常管理以及垃圾回收等重要功能,各自擁有一套完整的指令系統,以下簡要對比兩種虛擬機的不同。

①JAVA虛擬機運行的是JAVA字節碼,Dalvik虛擬機運行的是Dalvik字節碼
JAVA程序經過編譯,生成JAVA字節碼保存在class文件中,JVM通過解碼class文件中的內容來運行程序。而DVM
運行的是Dalvik字節碼,所有的Dalvik字節碼由JAVA字節碼轉換而來,并被打包到一個DEX(Dalvik Executable)可執行文件中,DVM通過解釋DEX文件來執行這些字節碼。

②Dalvik可執行文件體積更小
以下是JVM規范中以C的數據結構表達的class文件結構,class文件被虛擬機加載到內存中后便是這樣


class文件中包含多個不同的方法簽名,如果A類文件引用B類文件中的方法,方法簽名也會被復制到A類文件中(在虛擬機加載類的連接階段將會使用該簽名鏈接到B類的對應方法),也就是說,多個不同的類會同時包含相同的方法簽名,同樣地,大量的字符串常量在多個類文件中也被重復使用,這些冗余信息會直接增加文件的體積,而JVM在把描述類的數據從class文件加載到內存時,需要對數據進行校驗、轉換解析和初始化,最終才形成可以被虛擬機直接使用的JAVA類型,因為大量的冗余信息,會嚴重影響虛擬機解析文件的效率。
為了減小執行文件的體積,安卓使用Dalvik虛擬機,SDK中有個dx工具負責將JAVA字節碼轉換為Dalvik字節碼,dx工具對JAVA類文件重新排列,將所有JAVA類文件中的常量池分解,消除其中的冗余信息,重新組合形成一個常量池,所有的類文件共享同一個常量池,使得相同的字符串、常量在DEX文件中只出現一次,從而減小了文件的體積。
dx工具的轉換過程和DEX文件的結構如下圖所示。

③JVM基于棧,DVM基于寄存器
JAVA虛擬機基于棧結構,程序在運行時虛擬機需要頻繁的從棧上讀取寫入數據,這個過程需要更多的指令分派與內存訪問次數,會耗費很多CPU時間。
Dalvik虛擬機基于寄存器架構,數據的訪問通過寄存器間直接傳遞,這樣的訪問方式比基于棧方式要快很多。

[java] view plain copy
print?

public class Hello {
public int foo(int a, int b) {
return (a + b) * (a - b);
}

public static void main(String[] args) {  
    Hello t = new Hello();  
    System.out.print(t.foo(5, 3));  
}  

}

以這段代碼中的foo方法為例,編譯成class文件后,反編譯class文件查看JAVA字節碼:
[plain] view plain copy
print?

Code:
0: iload_1
1: iload_2
2: iadd
3: iload_1
4: iload_2
5: isub
6: imul
7: ireturn

同樣代碼的foo方法,編譯生成dex文件后,查看Dalvik字節碼:
[plain] view plain copy
print?

0000: add-int v0, v3, v4
0002: sub-int v1, v3, v4
0004: mul-int/2addr v0, v1
0005: return v0

由以上字節碼對比,代碼指令減少了,執行速度當然也會更快。
下圖為兩種虛擬機分別執行自己的字節碼的過程對比。


3、什么是ART虛擬機,和JVM/DVM有什么不同?

首先了解JIT(Just In Time,即時編譯技術)和AOT(Ahead Of Time,預編譯技術)兩種編譯模式。

JIT以JVM為例,javac把程序源碼編譯成JAVA字節碼,JVM通過逐條解釋字節碼將其翻譯成對應的機器指令,逐條讀入,逐條解釋翻譯,執行速度必然比C/C++編譯后的可執行二進制字節碼程序慢,為了提高執行速度,就引入了JIT技術,JIT會在運行時分析應用程序的代碼,識別哪些方法可以歸類為熱方法,這些方法會被JIT編譯器編譯成對應的匯編代碼,然后存儲到代碼緩存中,以后調用這些方法時就不用解釋執行了,可以直接使用代碼緩存中已編譯好的匯編代碼。這能顯著提升應用程序的執行效率。(安卓Dalvik虛擬機在2.2中增加了JIT)
相對的AOT就是指C/C++這類語言,編譯器在編譯時直接將程序源碼編譯成目標機器碼,運行時直接運行機器碼。

Dalvik虛擬機執行的是dex字節碼,ART虛擬機執行的是本地機器碼

Dalvik執行的是dex字節碼,依靠JIT編譯器去解釋執行,運行時動態地將執行頻率很高的dex字節碼翻譯成本地機器碼,然后在執行,但是將dex字節碼翻譯成本地機器碼是發生在應用程序的運行過程中,并且應用程序每一次重新運行的時候,都要重新做這個翻譯工作,因此,及時采用了JIT,Dalvik虛擬機的總體性能還是不能與直接執行本地機器碼的ART虛擬機相比。

安卓運行時從Dalvik虛擬機替換成ART虛擬機,并不要求開發者重新將自己的應用直接編譯成目標機器碼,也就是說,應用程序仍然是一個包含dex字節碼的apk文件。所以在安裝應用的時候,dex中的字節碼將被編譯成本地機器碼,之后每次打開應用,執行的都是本地機器碼。移除了運行時的解釋執行,效率更高,啟動更快。(安卓在4.4中發布了ART運行時)

ART優點:
①系統性能顯著提升
②應用啟動更快、運行更快、體驗更流暢、觸感反饋更及時
③續航能力提升
④支持更低的硬件

ART缺點
①更大的存儲空間占用,可能增加10%-20%
②更長的應用安裝時間

總的來說ART就是“空間換時間”

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容