39階段精品云計(jì)算大數(shù)據(jù)項(xiàng)目實(shí)戰(zhàn)視頻教程
互聯(lián)網(wǎng)技術(shù)(java框架、分布式、集群)干貨視頻大全
200本經(jīng)典編程相關(guān)書籍下載
程序員如何制作高質(zhì)量的簡歷【視頻 真實(shí)簡歷】
java程序代碼需要編譯后才能在虛擬機(jī)中運(yùn)行,編譯涉及到非常多的知識(shí)層面:編譯原理、語言規(guī)范、虛擬機(jī)規(guī)范、本地機(jī)器碼優(yōu)化等;了解編譯過程有利于了解整個(gè)Java運(yùn)行機(jī)制,不僅可以使得我們編寫出更優(yōu)秀的代碼,而且還可以使得在JVM調(diào)優(yōu)時(shí)更得心應(yīng)手。
下面我們先來看下Java體系中的三種編譯方式:前端編譯、即時(shí)編譯(JIT編譯)、靜態(tài)提前編譯(AOT編譯),先來了解它們各有什么優(yōu)點(diǎn)和缺點(diǎn),再來看看主流的前端編譯 JIT編譯方式的運(yùn)作過程。
1、前端編譯
把Java源碼文件(.java)編譯成Class文件(.class)的過程;
也即把滿足Java語言規(guī)范的程序轉(zhuǎn)化為滿足JVM規(guī)范所要求格式的能;
優(yōu)點(diǎn):
a.這階段的優(yōu)化是指程序編碼方面的;
b.許多Java語法新特性('語法糖':泛型、內(nèi)部類等等),是靠前端編譯器實(shí)現(xiàn)的,而不是依賴虛擬機(jī);
c.編譯成的Class文件可以直接給JVM解釋器解釋執(zhí)行,省去編譯時(shí)間,加快啟動(dòng)速度;
缺點(diǎn):
1.對(duì)代碼運(yùn)行效率幾乎沒有任何優(yōu)化措施;
2.解釋執(zhí)行效率較低,所以需要結(jié)合下面的JIT編譯;
3.前端編譯器:Oracle javac、Eclipse JDT中的增量式編譯器(ECJ)等;
2、后端編譯/即時(shí)(JIT)編譯
通過Java虛擬機(jī)(JVM)內(nèi)置的即時(shí)編譯器(Just In Time Compiler,JIT編譯器);在運(yùn)行時(shí)把Class文件字節(jié)碼編譯成本地機(jī)器碼的過程;
優(yōu)點(diǎn):
a.通過在運(yùn)行時(shí)收集監(jiān)控信息,把'熱點(diǎn)代碼'(Hot Spot Code)編譯成與本地平臺(tái)相關(guān)的機(jī)器碼,并進(jìn)行各種層次的優(yōu)化;
b.可以大大提高執(zhí)行效率;
缺點(diǎn):
a.收集監(jiān)控信息影響程序運(yùn)行;
b.編譯過程占用程序運(yùn)行時(shí)間(如使得啟動(dòng)速度變慢);
c.編譯機(jī)器碼占用內(nèi)存;
d.JIT編譯器:HotSpot虛擬機(jī)的C1、C2編譯器等;
另外,JIT編譯速度及編譯結(jié)果的優(yōu)劣,是衡量一個(gè)JVM性能的很重要指標(biāo);所以對(duì)程序運(yùn)行性能優(yōu)化集中到這個(gè)階段;也就是說可以對(duì)這個(gè)階段進(jìn)行JVM調(diào)優(yōu);
3、靜態(tài)提前編譯(Ahead Of Time,AOT編譯)
程序運(yùn)行前,直接把Java源碼文件(.java)編譯成本地機(jī)器碼的過程;
優(yōu)點(diǎn):
a.編譯不占用運(yùn)行時(shí)間,可以做一些較耗時(shí)的優(yōu)化,并可加快程序啟動(dòng);
b.把編譯的本地機(jī)器碼保存磁盤,不占用內(nèi)存,并可多次使用;
缺點(diǎn):
a.因?yàn)镴ava語言的動(dòng)態(tài)性(如反射)帶來了額外的復(fù)雜性,影響了靜態(tài)編譯代碼的質(zhì)量;
b.一般靜態(tài)編譯不如JIT編譯的質(zhì)量,這種方式用得比較少;
c.靜態(tài)提前編譯器(AOT編譯器):JAOTC、GCJ、Excelsior JET、ART (Android Runtime)等;
4、前端編譯 JIT編譯
到這里,我們知道目前Java體系中主要還是采用前端編譯 JIT編譯的方式,如JDK中的HotSpot虛擬機(jī)。
前端編譯 JIT編譯方式的運(yùn)作過程大體如下:
1、首先通過前端編譯把符合Java語言規(guī)范的程序代碼轉(zhuǎn)化為滿足JVM規(guī)范所要求Class格式;
2、然后程序啟動(dòng)時(shí)Class格式文件發(fā)揮作用,解釋執(zhí)行,省去編譯時(shí)間,加快啟動(dòng)速度;
3、針對(duì)Class解釋執(zhí)行效率低的問題,在運(yùn)行中收集性能監(jiān)控信息,得知'熱點(diǎn)代碼';
4、JIT逐漸發(fā)揮作用,把越來越多的熱點(diǎn)代碼'編譯優(yōu)化成本地代碼,提高執(zhí)行效率;
視頻資源下載
21套精品Java架構(gòu)師高并發(fā)高性能高可用分布式集群教程(4000G)
39階段精品云計(jì)算大數(shù)據(jù)項(xiàng)目實(shí)戰(zhàn)視頻教程
200本經(jīng)典編程相關(guān)書籍下載
互聯(lián)網(wǎng)技術(shù)(java框架、分布式、集群)干貨視頻大全
程序員如何制作高質(zhì)量的簡歷【視頻 真實(shí)簡歷】