Java編譯優(yōu)化 Brief

雖然在不同目標(biāo)平臺(tái)上的JVM實(shí)現(xiàn)不一樣,但是有3種Java Compiler是極具代表性的:

  • 前端編譯器: 如我們經(jīng)常使用的javac. 在編譯時(shí)將全部的java源碼文件轉(zhuǎn)變成class文件挨下,再放入目標(biāo)機(jī)器執(zhí)行
  • JIT編譯器:Android Dalvik / Android ART. 在運(yùn)行時(shí)期將字節(jié)碼轉(zhuǎn)變成機(jī)器碼
  • AOT Compiler: (Ahead of Time Compiler) 在編譯時(shí)就將java文件編譯成目標(biāo)平臺(tái)上的機(jī)器碼

前端編譯器

從傳統(tǒng)的javac來看熔恢,編譯過程大致分為3個(gè)階段:

  1. 解析與填充符號(hào)表過程
  2. 注解處理器的注解處理過程
  3. 分析與字節(jié)碼生成過程

解析與填充符號(hào)表過程

  • 詞法與語法分析: 將源代碼中的字符流構(gòu)造成抽象語法樹的過程。抽象語法樹是一種用來描述程序代碼語法結(jié)構(gòu)的樹形表示方法复颈。
  • 填充符號(hào)表: 符號(hào)表是一組符號(hào)地址和符號(hào)信息構(gòu)成的表格绩聘。

注解處理器處理

我們平時(shí)使用的Java注解沥割,本質(zhì)就是用來對(duì)語法樹做出修改,處理器的任務(wù)便是在編譯是識(shí)別出這些注解同時(shí)修改抽象語法樹凿菩。

語義分析與字節(jié)碼生成

  • 標(biāo)注檢查:語義分析的第一個(gè)步驟机杜,用來檢查包括諸如使用的變量是否已經(jīng)聲明、變量與賦值之間的數(shù)據(jù)類型是否能夠匹配衅谷。其中有一個(gè)重要的步驟就是常量折疊
    如:int a = 3 + 2椒拗, javap查看生成的class字節(jié)碼,iconst指令向操作數(shù)棧中壓入的是常量值5获黔,這樣在運(yùn)行時(shí)期就不會(huì)CPU的運(yùn)算量重新計(jì)算蚀苛。
  • 數(shù)據(jù)及控制流分析
    用于檢查諸如局部變量在使用前是否已經(jīng)賦值,方法的每條路徑上是否都有返回值玷氏,受查異常是否都被正常處理等問題堵未。
  • 解語法糖(desugar)
    Java中我們經(jīng)常使用的語法糖有泛型自動(dòng)裝箱/拆箱盏触、遍歷循環(huán)渗蟹、條件編譯等.. 由于這些語法在運(yùn)行時(shí)無法被識(shí)別,因此需要在編譯階段就將他們還原回簡單的基礎(chǔ)語法結(jié)構(gòu)赞辩。
    泛型
    泛型的本質(zhì)是參數(shù)化類型的應(yīng)用雌芽,參數(shù)類型可以用在類、接口和方法的創(chuàng)建中辨嗽,分別稱為泛型類世落、泛型接口和泛型方法。
    在Java中糟需,泛型只在源碼中存在屉佳,一旦經(jīng)常編譯,就會(huì)替換成原來的原生類型并且在相應(yīng)的地方加上了強(qiáng)制類型轉(zhuǎn)換代碼洲押。這一過程也叫做類型擦除
    自動(dòng)裝箱/拆箱
    基本類型自動(dòng)裝箱成包裝類型忘古,包裝類型拆箱成基本類型,大多數(shù)Java程序員都已經(jīng)了解诅诱。只是使用上有些地方需要注意,比方包裝類型在使用“==”進(jìn)行比較時(shí)送朱,只有遇到算術(shù)運(yùn)算時(shí)才會(huì)自動(dòng)拆箱娘荡。
    遍歷循環(huán)
    諸如 for(int i : list) {} 這樣的loop循環(huán)在編譯后都會(huì)轉(zhuǎn)換成對(duì)數(shù)據(jù)結(jié)構(gòu)iterator的調(diào)用
    條件編譯
    對(duì)于if和常量搭配使用,在編譯器發(fā)現(xiàn)不會(huì)執(zhí)行到的語句塊驶沼,將不會(huì)出現(xiàn)在編譯之后的class文件當(dāng)中
  • 生成字節(jié)碼class文件
    在Compiler生成class文件時(shí)炮沐,不僅僅將前面步驟生成的信息轉(zhuǎn)化成字節(jié)碼,還會(huì)進(jìn)行少量的代碼添加和轉(zhuǎn)換工作回怜,如<init>和<clinit>就是在該階段添加進(jìn)class文件當(dāng)中大年,如果Compiler發(fā)現(xiàn)代碼中沒有任何構(gòu)造器换薄,那么將會(huì)添加一個(gè)無參數(shù)的、訪問性與當(dāng)前類一致的構(gòu)造器(也即經(jīng)常所說的默認(rèn)無參構(gòu)造器)

JIT

在了解早期編譯優(yōu)化時(shí)已經(jīng)學(xué)習(xí)了傳統(tǒng)的前端編譯器翔试。那么對(duì)商用JVM來說轻要,還有一種極其重要的編譯器,這便是JIT Compiler(Just In Time Compiler)垦缅。我們知道冲泥,Java程序都是通過解釋器(interpreter)進(jìn)行解釋執(zhí)行的,而一些頻繁運(yùn)行的程序代碼便會(huì)被認(rèn)為熱點(diǎn)代碼(Hot Spot Code)壁涎。JIT的任務(wù)便是將這些熱點(diǎn)代碼編譯成目標(biāo)平臺(tái)的機(jī)器碼凡恍,并進(jìn)行各種層次的優(yōu)化。
JIT雖然能夠加快JVM的執(zhí)行效率怔球,但是卻同內(nèi)存資源有著更高的要求嚼酝,解釋器可以節(jié)約內(nèi)存,在一些資源受限的機(jī)器運(yùn)行JVM時(shí)解釋器更受青睞竟坛。不過現(xiàn)在已經(jīng)很少見到?jīng)]有JIT的虛擬機(jī)了闽巩,更多的是兩種配合使用,甚至是三種Compiler一起使用流码。如Android在5.0 以前使用的Dalvik 虛擬機(jī)就使用的是Interpreter + JIT又官,5.0 ~ 7.0 之間使用的ART 是Interpreter + AOT的組合,而在最新的7.0之后的ART上使用的是Interpreter + JIT + AOT的組合漫试。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末六敬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驾荣,更是在濱河造成了極大的恐慌外构,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件播掷,死亡現(xiàn)場離奇詭異审编,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)歧匈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門垒酬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人件炉,你說我怎么就攤上這事勘究。” “怎么了斟冕?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵口糕,是天一觀的道長。 經(jīng)常有香客問我磕蛇,道長景描,這世上最難降的妖魔是什么十办? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮超棺,結(jié)果婚禮上向族,老公的妹妹穿的比我還像新娘。我一直安慰自己说搅,他們只是感情好炸枣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弄唧,像睡著了一般适肠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上候引,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天侯养,我揣著相機(jī)與錄音,去河邊找鬼澄干。 笑死逛揩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的麸俘。 我是一名探鬼主播辩稽,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼从媚!你這毒婦竟也來了逞泄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤拜效,失蹤者是張志新(化名)和其女友劉穎喷众,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體紧憾,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡到千,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赴穗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憔四。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖般眉,靈堂內(nèi)的尸體忽然破棺而出加矛,到底是詐尸還是另有隱情,我是刑警寧澤煤篙,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站毁腿,受9級(jí)特大地震影響辑奈,放射性物質(zhì)發(fā)生泄漏苛茂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一鸠窗、第九天 我趴在偏房一處隱蔽的房頂上張望妓羊。 院中可真熱鬧,春花似錦稍计、人聲如沸躁绸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽净刮。三九已至,卻和暖如春硅则,著一層夾襖步出監(jiān)牢的瞬間淹父,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工怎虫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暑认,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓大审,卻偏偏與公主長得像蘸际,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徒扶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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