Dalvik虛擬機(jī)和Art虛擬機(jī)

Dalvik虛擬機(jī)

DVM是Dalvik Virtual Machine的縮寫(xiě),是Android4.4及以前使用的虛擬機(jī)顽分,所有android程序都運(yùn)行在android系統(tǒng)進(jìn)程里赌莺,每個(gè)進(jìn)程對(duì)應(yīng)著一個(gè)Dalvik虛擬機(jī)實(shí)例南蹂。

DVM和JVM的區(qū)別

  1. 執(zhí)行的字節(jié)碼不同

    • JAVA虛擬機(jī)運(yùn)行的是JAVA字節(jié)碼算凿,Dalvik虛擬機(jī)運(yùn)行的是Dalvik字節(jié)碼
     JVM: .java -> javac -> .class -> jar -> .jar 
     DVM: .java -> javac -> .class -> dx.bat -> .dex 
    
    • Dalvik可執(zhí)行文件體積更小
      一般情況下凳谦,Java類(lèi)文件中包含多個(gè)不同的方法簽名忆畅,如果其他的類(lèi)文件引用該類(lèi)文件中的方法,方法簽名也會(huì)被復(fù)制到其類(lèi)文件中尸执,也就是說(shuō)家凯,多個(gè)不同的類(lèi)會(huì)同時(shí)包含相同的方法簽名,同樣地如失,大量的字符串常量在多個(gè)類(lèi)文件中也被重復(fù)使用绊诲。這些冗余信息會(huì)直接增加文件的體積,同時(shí)也會(huì)嚴(yán)重影響虛擬機(jī)解析文件的效率褪贵。
      安卓使用Dalvik虛擬機(jī)掂之,SDK中有個(gè)dx工具負(fù)責(zé)將JAVA字節(jié)碼轉(zhuǎn)換為Dalvik字節(jié)碼,dx工具對(duì)JAVA類(lèi)文件重新排列脆丁,將所有JAVA類(lèi)文件中的常量池分解世舰,消除其中的冗余信息,重新組合形成一個(gè)常量池偎快,所有的類(lèi)文件共享同一個(gè)常量池冯乘,使得相同的字符串、常量在DEX文件中只出現(xiàn)一次晒夹,從而減小了文件的體積。
  2. 基于的架構(gòu)不同
    Dvm基于寄存器姊氓,所以它的指令是二地址和三地址混合丐怯,指令中指明了操作數(shù)的地址;jvm基于棧翔横,它的指令是零地址读跷,指令的操作數(shù)對(duì)象默認(rèn)是操作數(shù)棧中的幾個(gè)位置。但基于寄存器的指令由于需要指定源地址和目標(biāo)地址禾唁,因此需要占用更多的指令空間效览。

    Java虛擬機(jī)基于棧架構(gòu)无切。程序在運(yùn)行時(shí)虛擬機(jī)需要頻繁的從棧上讀取或?qū)懭霐?shù)據(jù),這個(gè)過(guò)程需要更多的指令分派與內(nèi)存訪問(wèn)次數(shù)丐枉, 會(huì)耗費(fèi)不少CPU時(shí)間哆键, 對(duì)千像手機(jī)設(shè)備資源有限的設(shè)備來(lái)說(shuō), 這是相當(dāng)大的一筆開(kāi)銷(xiāo)瘦锹。Dalvik 虛擬機(jī)基于寄存器架構(gòu)籍嘹。數(shù)據(jù)的訪問(wèn)通過(guò)寄存器間直接傳遞, 這樣的訪問(wèn)方式比基千棧方式要快很多弯院。

Dalvik堆
Dalvik虛擬機(jī)用來(lái)分配對(duì)象的堆劃分為兩部分辱士,一部分叫做Active Heap,另一部分叫做Zygote Heap听绳。Android系統(tǒng)啟動(dòng)后颂碘,會(huì)有一個(gè)Zygote進(jìn)程創(chuàng)建第一個(gè)Dalvik虛擬機(jī),它只維護(hù)了一個(gè)堆椅挣。以后啟動(dòng)的所有應(yīng)用程序進(jìn)程是被Zygote進(jìn)程fork出來(lái)的凭涂,并都持有一個(gè)自己的Dalvik虛擬機(jī)。在創(chuàng)建應(yīng)用程序的過(guò)程中贴妻,Dalvik虛擬機(jī)采用COW策略復(fù)制Zygote進(jìn)程的地址空間切油。
當(dāng)創(chuàng)建第一個(gè)應(yīng)用程序進(jìn)程時(shí),會(huì)將已經(jīng)使用了的那部分堆內(nèi)存劃分為一部分名惩,還沒(méi)有使用的堆內(nèi)存劃分為另外一部分澎胡。前者就稱(chēng)為Zygote堆,后者就稱(chēng)為Active堆娩鹉。這樣只需把zygote堆中的內(nèi)容復(fù)制給應(yīng)用程序進(jìn)程就可以了攻谁。以后無(wú)論是Zygote進(jìn)程,還是應(yīng)用程序進(jìn)程弯予,當(dāng)它們需要分配對(duì)象的時(shí)候戚宦,都在Active堆上進(jìn)行。這樣就可以使得Zygote堆盡可能少地被執(zhí)行寫(xiě)操作锈嫩,因而就可以減少執(zhí)行寫(xiě)時(shí)拷貝的操作受楼。在Zygote堆里面分配的對(duì)象其實(shí)主要就是Zygote進(jìn)程在啟動(dòng)過(guò)程中預(yù)加載的類(lèi)、資源和對(duì)象了呼寸。這意味著這些預(yù)加載的類(lèi)艳汽、資源和對(duì)象可以在Zygote進(jìn)程和應(yīng)用程序進(jìn)程中做到長(zhǎng)期共享。這樣既能減少拷貝操作对雪,還能減少對(duì)內(nèi)存的需求河狐。Dalvik虛擬機(jī)進(jìn)行部分垃圾收集時(shí),實(shí)際上就是只收集在Active堆上分配的對(duì)象。

Art虛擬機(jī)

為了區(qū)分Art虛擬機(jī)和Dalvik虛擬機(jī)馋艺,需要先介紹下面兩個(gè)概念栅干。

  • JIT
    JIT(Just-in-time Compilation,即時(shí)編譯)捐祠,又稱(chēng)為動(dòng)態(tài)編譯碱鳞,是一種通過(guò)在運(yùn)行時(shí)將字節(jié)碼翻譯為機(jī)器碼的技術(shù),使得程序的執(zhí)行速度更快雏赦。
    在JVM中劫笙,javac將源程序編譯成java字節(jié)碼,JVM通過(guò)逐條解釋將字節(jié)碼翻譯成對(duì)應(yīng)的機(jī)器指令星岗,逐條讀入填大,逐條解釋翻譯,比較慢俏橘;為了提升速度允华,當(dāng)App運(yùn)行時(shí),每當(dāng)遇到一個(gè)新類(lèi)寥掐,JIT編譯器就會(huì)對(duì)這個(gè)類(lèi)進(jìn)行編譯靴寂,經(jīng)過(guò)編譯后的代碼,會(huì)被優(yōu)化成相當(dāng)精簡(jiǎn)的原生型指令碼(即native code)召耘,這樣在下次執(zhí)行到相同邏輯的時(shí)候百炬,速度就會(huì)更快。
    但是污它,有一點(diǎn)需要注意剖踊,dex字節(jié)碼翻譯成本地機(jī)器碼是發(fā)生在應(yīng)用程序的運(yùn)行過(guò)程中的,并且應(yīng)用程序每一次重新運(yùn)行的時(shí)候衫贬,都要做重做這個(gè)翻譯工作德澈,每次重新打開(kāi)App,都需要JIT編譯固惯。

  • AOT
    ART的策略與Dalvik不同梆造,在ART 環(huán)境中,應(yīng)用在第一次安裝的時(shí)候葬毫,字節(jié)碼就會(huì)預(yù)先編譯成機(jī)器碼镇辉,使其成為真正的本地應(yīng)用。APK在安裝的時(shí)候供常,打包在里面的classes.dex文件會(huì)被工具dex2oat翻譯成本地機(jī)器指令摊聋,最終得到一個(gè)ELF格式的oat文件。
    這樣可以保證以后每次打開(kāi)應(yīng)用栈暇,執(zhí)行的都是本地機(jī)器碼。去除了運(yùn)行時(shí)的解釋執(zhí)行箍镜,效率更高源祈,啟動(dòng)更快煎源。

  • ART和Dalvik的區(qū)別

    1. ART需要應(yīng)用程序在安裝時(shí),就把程序代碼轉(zhuǎn)換成機(jī)器語(yǔ)言香缺,所以這會(huì)消耗掉更多的存儲(chǔ)空間手销,但消耗掉空間的增幅通常不會(huì)超過(guò)應(yīng)用代碼包大小的20%
    2. 由于有了一個(gè)轉(zhuǎn)碼的過(guò)程,所以應(yīng)用安裝時(shí)間難免會(huì)延長(zhǎng)

參考文章:

  1. http://www.reibang.com/p/156a71091333
  2. http://www.reibang.com/p/713d24fa9982
  3. https://blog.csdn.net/computer30000/article/details/79941151
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末图张,一起剝皮案震驚了整個(gè)濱河市锋拖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祸轮,老刑警劉巖兽埃,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異适袜,居然都是意外死亡柄错,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)苦酱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)售貌,“玉大人,你說(shuō)我怎么就攤上這事疫萤∷炭纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵扯饶,是天一觀的道長(zhǎng)恒削。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帝际,這世上最難降的妖魔是什么蔓同? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蹲诀,結(jié)果婚禮上斑粱,老公的妹妹穿的比我還像新娘。我一直安慰自己脯爪,他們只是感情好则北,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著痕慢,像睡著了一般尚揣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掖举,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天快骗,我揣著相機(jī)與錄音,去河邊找鬼。 笑死方篮,一個(gè)胖子當(dāng)著我的面吹牛名秀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藕溅,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匕得,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了巾表?” 一聲冷哼從身側(cè)響起汁掠,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎集币,沒(méi)想到半個(gè)月后考阱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惠猿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年羔砾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶妖。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姜凄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趾访,到底是詐尸還是另有隱情态秧,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布扼鞋,位于F島的核電站申鱼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏云头。R本人自食惡果不足惜捐友,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溃槐。 院中可真熱鬧匣砖,春花似錦、人聲如沸昏滴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谣殊。三九已至拂共,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姻几,已是汗流浹背宜狐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工势告, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肌厨。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓培慌,卻偏偏與公主長(zhǎng)得像豁陆,于是被迫代替她去往敵國(guó)和親柑爸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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