從JVM到ART

眾所周知怜跑,android系統(tǒng)的底層操作系統(tǒng)是Linux顽冶,上層應(yīng)用程序是用java代碼或者kotlin來編寫的彪置,那么這些用高級(jí)語言編寫的應(yīng)用程序是如何運(yùn)行在linux系統(tǒng)之上呢挂洛?想必大家都知道了吹埠,鏈接這兩者的橋梁就是虛擬機(jī)斩郎。那么android的虛擬機(jī)和傳統(tǒng)的JVM有什么區(qū)別脑融,又有什么關(guān)系呢?要回答這些問題缩宜,我們先看下兩者在編譯成虛擬機(jī)可以執(zhí)行的字節(jié)碼或者機(jī)器語言過程的對(duì)比:

傳統(tǒng)的JVM肘迎,以Sun公司的HotSpot為例:

Android ART:

兩者的過程看,都會(huì)經(jīng)過javac編譯成class 文件锻煌,但是之后就走向了不同的方向

HotSpot生成class文件后就通過類加載器加載字節(jié)碼文件到虛擬機(jī)妓布,虛擬機(jī)經(jīng)過解釋器或者JIT 生成機(jī)器碼交由底層操作系統(tǒng)去執(zhí)行,而android在4.4版本后宋梧,Java文件在編譯成class文件,然后經(jīng)過Android平臺(tái)的dx工具轉(zhuǎn)換為Dex文件后,同Native code(JNI)和資源一起打包成apk,apk安裝到手機(jī)后解壓出Dex文件匣沼。Dalvik會(huì)通過dexopt工具將Dex優(yōu)化,成為Odex文件,Odex文件的效率比Dex高,但其中大部分代碼仍然需要每次執(zhí)行時(shí)編譯;而ART則會(huì)將Dex通過dex2oat工具編譯得到一個(gè)ELF文件,它是一個(gè)可執(zhí)行的文件。?在ART中捂龄,打包在APK里面的Dex字節(jié)碼是通過LLVM翻譯成本地機(jī)器指令的释涛。所以說經(jīng)過優(yōu)化編譯后,進(jìn)入到ART執(zhí)行的就已經(jīng)是機(jī)器碼了倦沧,效率大大的提高了唇撬。

進(jìn)入到虛擬機(jī)內(nèi)部后,具體的執(zhí)行方式又有什么不同呢展融?這就要回歸到基于棧虛擬機(jī)和基于寄存器虛擬機(jī)兩者的對(duì)比來看了窖认。

HotSpot基于棧的,基于棧的虛擬機(jī)有一個(gè)操作數(shù)棧的概念告希,虛擬機(jī)在進(jìn)行真正的運(yùn)算時(shí)都是直接與操作數(shù)棧(operand stack)進(jìn)行交互扑浸,不能直接操作內(nèi)存中數(shù)據(jù),也就是說不管進(jìn)行何種操作都要通過操作數(shù)棧來進(jìn)行燕偶,即使是數(shù)據(jù)傳遞這種簡單的操作喝噪。這樣做的直接好處就是虛擬機(jī)可以無視具體的物理架構(gòu),特別是寄存器杭跪。但缺點(diǎn)也顯而易見仙逻,就是速度慢,因?yàn)闊o論什么操作都要通過操作數(shù)棧這一結(jié)構(gòu)涧尿。

例如執(zhí)行”a = b + c”系奉,在基于棧的虛擬機(jī)上字節(jié)碼指令如下所示:

I1: LOAD C

I2: LOAD B

I3: ADD

I4: STORE A

操作數(shù)棧上的變化如下圖所示:

物理上操作如下:

基于寄存器的

比如a= b+c

指令只有一條:

I1: add a, b, c

物理機(jī)器上執(zhí)行:


綜上對(duì)比:

(1)指令條數(shù):棧式虛擬機(jī)多?

(2)代碼尺寸:棧式虛擬機(jī)?

(3)移植性:棧式虛擬機(jī)移植性更好?

(4)指令優(yōu)化:寄存器式虛擬機(jī)更能優(yōu)化

我們?cè)賮砜唇?jīng)過編譯后生成的class文件和dex文件,class文件java文件經(jīng)過javac編譯器生成的姑廉,有多少java文件就有多少個(gè)class文件缺亮,對(duì)于手機(jī)這樣對(duì)內(nèi)存和存儲(chǔ)空間有限的設(shè)備來說,太多的class的文件就有點(diǎn)不劃算了,而且查找太耗時(shí)萌踱,必須優(yōu)化葵礼。而Dex記錄整個(gè)工程中所有類文件的信息,注意是“整個(gè)工程”并鸵,即所有類文件信息鸳粉,并去除冗余,區(qū)域復(fù)用并整合园担。下面給出兩者文件的對(duì)比圖:

以上只是大概列出了ART區(qū)別于傳統(tǒng)的JVM比較重大的區(qū)別届谈,具體內(nèi)部實(shí)現(xiàn)上也有很大的區(qū)別。比如AOT弯汰,允許有多個(gè)ART實(shí)例艰山,內(nèi)存管理方式等等。最后ART是如何被創(chuàng)建出來呢咏闪?


Android系統(tǒng)在啟動(dòng)的時(shí)候曙搬,會(huì)創(chuàng)建一個(gè)Zygote進(jìn)程,充當(dāng)應(yīng)用程序進(jìn)程孵化器鸽嫂。Zygote進(jìn)程在啟動(dòng)的過程中纵装,又會(huì)創(chuàng)建一個(gè)ART虛擬機(jī)。Zygote進(jìn)程是通過復(fù)制自己來創(chuàng)建新的應(yīng)用程序進(jìn)程的据某。這意味著Zygote進(jìn)程會(huì)將自己的ART虛擬機(jī)復(fù)制給應(yīng)用程序進(jìn)程搂擦。通過這種方式就可以大大地提高應(yīng)用程序的啟動(dòng)速度,因?yàn)檫@種方式避免了每一個(gè)應(yīng)用程序進(jìn)程在啟動(dòng)的時(shí)候都要去創(chuàng)建一個(gè)ART哗脖。事實(shí)上,Zygote進(jìn)程通過自我復(fù)制的方式來創(chuàng)建應(yīng)用程序進(jìn)程扳还,省去的不僅僅是應(yīng)用程序進(jìn)程創(chuàng)建ART虛擬機(jī)的時(shí)間才避,還能省去應(yīng)用程序進(jìn)程加載各種系統(tǒng)庫和系統(tǒng)資源的時(shí)間,因?yàn)樗鼈冊(cè)赯ygote進(jìn)程中已經(jīng)加載過了氨距,并且也會(huì)連同ART虛擬機(jī)一起復(fù)制到應(yīng)用程序進(jìn)程中去桑逝。

最后我們總結(jié)下本文的主要內(nèi)容:

1,傳統(tǒng)虛擬機(jī)和ART編譯過程的不一致

2俏让,基于棧和基于寄存器的區(qū)別

3楞遏,傳統(tǒng)虛擬機(jī)和ART執(zhí)行文件的不一致

4,ART的創(chuàng)建過程

ART雖然是一個(gè)虛擬機(jī)首昔,但是它已經(jīng)不遵守虛擬機(jī)規(guī)范寡喝,但是一些JVM的核心理念還是保留了,比如垃圾回收機(jī)制等勒奇,如果想要更好的理解ART预鬓,建議還是先閱讀JVM規(guī)范,循序漸進(jìn)赊颠,慢慢摸索格二。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劈彪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子顶猜,更是在濱河造成了極大的恐慌沧奴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件长窄,死亡現(xiàn)場離奇詭異滔吠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抄淑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門屠凶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肆资,你說我怎么就攤上這事矗愧。” “怎么了郑原?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵唉韭,是天一觀的道長。 經(jīng)常有香客問我犯犁,道長属愤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任酸役,我火速辦了婚禮住诸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涣澡。我一直安慰自己贱呐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布入桂。 她就那樣靜靜地躺著奄薇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抗愁。 梳的紋絲不亂的頭發(fā)上馁蒂,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蜘腌,去河邊找鬼沫屡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撮珠,可吹牛的內(nèi)容都是我干的谁鳍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼倘潜!你這毒婦竟也來了绷柒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤涮因,失蹤者是張志新(化名)和其女友劉穎废睦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养泡,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漱凝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嗦玖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痒留。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芹敌。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肩榕,靈堂內(nèi)的尸體忽然破棺而出刚陡,到底是詐尸還是另有隱情,我是刑警寧澤株汉,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布筐乳,位于F島的核電站,受9級(jí)特大地震影響乔妈,放射性物質(zhì)發(fā)生泄漏蝙云。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一路召、第九天 我趴在偏房一處隱蔽的房頂上張望勃刨。 院中可真熱鬧,春花似錦股淡、人聲如沸朵你。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躲因,卻和暖如春早敬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背大脉。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工搞监, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镰矿。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓琐驴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绝淡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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