JVM瞳别、DVM征候、ANDROID RUN TIME(art)的區(qū)別(簡易篇)

1、什么是JVM祟敛?

JVM本質(zhì)上就是一個(gè)軟件疤坝,是計(jì)算機(jī)硬件的一層軟件抽象,在這之上才能夠運(yùn)行Java程序馆铁,JAVA在編譯后會生成類似于匯編語言的JVM字節(jié)碼跑揉,與C語言編譯后產(chǎn)生的匯編語言不同的是,C編譯成的匯編語言會直接在硬件上跑,但JAVA編譯后生成的字節(jié)碼是在JVM上跑历谍,需要由JVM把字節(jié)碼翻譯成機(jī)器指令现拒,才能使JAVA程序跑起來。

JVM運(yùn)行在操作系統(tǒng)上望侈,屏蔽了底層實(shí)現(xiàn)的差異印蔬,從而有了JAVA吹噓的平臺獨(dú)立性和Write Once Run Anywhere。根據(jù)JVM規(guī)范實(shí)現(xiàn)的具體虛擬機(jī)有幾十種脱衙,主流的JVM包括Hotspot侥猬、Jikes RVM等,都是用C/C++和匯編編寫的捐韩,每個(gè)JRE編譯的時(shí)候針對每個(gè)平臺編譯退唠,因此下載JRE(JVM、Java核心類庫和支持文件)的時(shí)候是分平臺的荤胁,JVM的作用是把平臺無關(guān)的.class里面的字節(jié)碼翻譯成平臺相關(guān)的機(jī)器碼瞧预,來實(shí)現(xiàn)跨平臺。

2寨蹋、什么是DVM松蒜,和JVM有什么不同?

JVM是Java Virtual Machine已旧,而DVM就是Dalvik?Virtual Machine秸苗,是安卓中使用的虛擬機(jī),所有安卓程序都運(yùn)行在安卓系統(tǒng)進(jìn)程里运褪,每個(gè)進(jìn)程對應(yīng)著一個(gè)Dalvik虛擬機(jī)實(shí)例惊楼。他們都提供了對象生命周期管理、堆棧管理秸讹、線程管理檀咙、安全和異常管理以及垃圾回收等重要功能,各自擁有一套完整的指令系統(tǒng)璃诀,以下簡要對比兩種虛擬機(jī)的不同弧可。

①JAVA虛擬機(jī)運(yùn)行的是JAVA字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是Dalvik字節(jié)碼

JAVA程序經(jīng)過編譯劣欢,生成JAVA字節(jié)碼保存在class文件中棕诵,JVM通過解碼class文件中的內(nèi)容來運(yùn)行程序。而DVM運(yùn)行的是Dalvik字節(jié)碼凿将,所有的Dalvik字節(jié)碼由JAVA字節(jié)碼轉(zhuǎn)換而來校套,并被打包到一個(gè)DEX(Dalvik Executable)可執(zhí)行文件中,DVM通過解釋DEX文件來執(zhí)行這些字節(jié)碼牧抵。

②Dalvik可執(zhí)行文件體積更小

class文件中包含多個(gè)不同的方法簽名笛匙,如果A類文件引用B類文件中的方法侨把,方法簽名也會被復(fù)制到A類文件中(在虛擬機(jī)加載類的連接階段將會使用該簽名鏈接到B類的對應(yīng)方法),也就是說妹孙,多個(gè)不同的類會同時(shí)包含相同的方法簽名秋柄,同樣地,大量的字符串常量在多個(gè)類文件中也被重復(fù)使用涕蜂,這些冗余信息會直接增加文件的體積华匾,而JVM在把描述類的數(shù)據(jù)從class文件加載到內(nèi)存時(shí),需要對數(shù)據(jù)進(jìn)行校驗(yàn)机隙、轉(zhuǎn)換解析和初始化,最終才形成可以被虛擬機(jī)直接使用的JAVA類型萨西,因?yàn)榇罅康娜哂嘈畔⒂新梗瑫?yán)重影響虛擬機(jī)解析文件的效率。

為了減小執(zhí)行文件的體積谎脯,安卓使用Dalvik虛擬機(jī)葱跋,SDK中有個(gè)dx工具負(fù)責(zé)將JAVA字節(jié)碼轉(zhuǎn)換為Dalvik字節(jié)碼,dx工具對JAVA類文件重新排列源梭,將所有JAVA類文件中的常量池分解娱俺,消除其中的冗余信息,重新組合形成一個(gè)常量池废麻,所有的類文件共享同一個(gè)常量池荠卷,使得相同的字符串、常量在DEX文件中只出現(xiàn)一次烛愧,從而減小了文件的體積油宜。

③JVM基于棧,DVM基于寄存器

JAVA虛擬機(jī)基于棧結(jié)構(gòu)怜姿,程序在運(yùn)行時(shí)虛擬機(jī)需要頻繁的從棧上讀取寫入數(shù)據(jù)慎冤,這個(gè)過程需要更多的指令分派與內(nèi)存訪問次數(shù),會耗費(fèi)很多CPU時(shí)間沧卢。

Dalvik虛擬機(jī)基于寄存器架構(gòu)蚁堤,數(shù)據(jù)的訪問通過寄存器間直接傳遞,這樣的訪問方式比基于棧方式要快很多但狭。

3披诗、什么是ART虛擬機(jī),和JVM/DVM有什么不同熟空?

首先了解JIT(Just In Time藤巢,即時(shí)編譯技術(shù))和AOT(Ahead Of Time,預(yù)編譯技術(shù))兩種編譯模式息罗。

JIT以JVM為例掂咒,javac把程序源碼編譯成JAVA字節(jié)碼,JVM通過逐條解釋字節(jié)碼將其翻譯成對應(yīng)的機(jī)器指令,逐條讀入绍刮,逐條解釋翻譯温圆,執(zhí)行速度必然比C/C++編譯后的可執(zhí)行二進(jìn)制字節(jié)碼程序慢,為了提高執(zhí)行速度孩革,就引入了JIT技術(shù)岁歉,JIT會在運(yùn)行時(shí)分析應(yīng)用程序的代碼,識別哪些方法可以歸類為熱方法膝蜈,這些方法會被JIT編譯器編譯成對應(yīng)的匯編代碼锅移,然后存儲到代碼緩存中,以后調(diào)用這些方法時(shí)就不用解釋執(zhí)行了饱搏,可以直接使用代碼緩存中已編譯好的匯編代碼非剃。這能顯著提升應(yīng)用程序的執(zhí)行效率。(安卓Dalvik虛擬機(jī)在2.2中增加了JIT)

相對的AOT就是指C/C++這類語言推沸,編譯器在編譯時(shí)直接將程序源碼編譯成目標(biāo)機(jī)器碼备绽,運(yùn)行時(shí)直接運(yùn)行機(jī)器碼。

Dalvik虛擬機(jī)執(zhí)行的是dex字節(jié)碼鬓催,ART虛擬機(jī)執(zhí)行的是本地機(jī)器碼

Dalvik執(zhí)行的是dex字節(jié)碼肺素,依靠JIT編譯器去解釋執(zhí)行,運(yùn)行時(shí)動態(tài)地將執(zhí)行頻率很高的dex字節(jié)碼翻譯成本地機(jī)器碼宇驾,然后在執(zhí)行倍靡,但是將dex字節(jié)碼翻譯成本地機(jī)器碼是發(fā)生在應(yīng)用程序的運(yùn)行過程中,并且應(yīng)用程序每一次重新運(yùn)行的時(shí)候飞苇,都要重新做這個(gè)翻譯工作菌瘫,因此,即使采用了JIT布卡,Dalvik虛擬機(jī)的總體性能還是不能與直接執(zhí)行本地機(jī)器碼的ART虛擬機(jī)相比雨让。

安卓運(yùn)行時(shí)從Dalvik虛擬機(jī)替換成ART虛擬機(jī),并不要求開發(fā)者重新將自己的應(yīng)用直接編譯成目標(biāo)機(jī)器碼忿等,也就是說栖忠,應(yīng)用程序仍然是一個(gè)包含dex字節(jié)碼的apk文件。所以在安裝應(yīng)用的時(shí)候贸街,dex中的字節(jié)碼將被編譯成本地機(jī)器碼庵寞,之后每次打開應(yīng)用,執(zhí)行的都是本地機(jī)器碼薛匪。移除了運(yùn)行時(shí)的解釋執(zhí)行捐川,效率更高,啟動更快逸尖。(安卓在4.4中發(fā)布了ART運(yùn)行時(shí))

ART優(yōu)點(diǎn):

①系統(tǒng)性能顯著提升

②應(yīng)用啟動更快古沥、運(yùn)行更快瘸右、體驗(yàn)更流暢、觸感反饋更及時(shí)

③續(xù)航能力提升

④支持更低的硬件

ART缺點(diǎn)

①更大的存儲空間占用岩齿,可能增加10%-20%

②更長的應(yīng)用安裝時(shí)間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末太颤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盹沈,更是在濱河造成了極大的恐慌龄章,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乞封,死亡現(xiàn)場離奇詭異做裙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肃晚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門菇用,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陷揪,你說我怎么就攤上這事≡忧睿” “怎么了悍缠?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耐量。 經(jīng)常有香客問我飞蚓,道長,這世上最難降的妖魔是什么廊蜒? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任趴拧,我火速辦了婚禮,結(jié)果婚禮上山叮,老公的妹妹穿的比我還像新娘著榴。我一直安慰自己,他們只是感情好屁倔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布脑又。 她就那樣靜靜地躺著,像睡著了一般锐借。 火紅的嫁衣襯著肌膚如雪问麸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天钞翔,我揣著相機(jī)與錄音严卖,去河邊找鬼。 笑死布轿,一個(gè)胖子當(dāng)著我的面吹牛哮笆,可吹牛的內(nèi)容都是我干的来颤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疟呐,長吁一口氣:“原來是場噩夢啊……” “哼脚曾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起启具,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤本讥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鲁冯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拷沸,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年薯演,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撞芍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跨扮,死狀恐怖序无,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衡创,我是刑警寧澤帝嗡,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站璃氢,受9級特大地震影響哟玷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜一也,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一巢寡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椰苟,春花似錦抑月、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至须误,卻和暖如春挨稿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背京痢。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工奶甘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祭椰。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓臭家,卻偏偏與公主長得像疲陕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子钉赁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容