Java三種編譯方式

來源:互聯網
上載者:User

標籤:機器碼   time   java源碼   源碼   衡量   效能最佳化   需要   jvm   javac   

  Java程式碼需要編譯後才能在虛擬機器中運行,編譯涉及到非常多的知識層面:編譯原理、語言規範、虛擬機器規範、本地機器碼最佳化等;瞭解編譯過程有利於瞭解整個Java運行機制,不僅可以使得我們編寫出更優秀的代碼,而且還可以使得在JVM調優時更得心應手。

下面我們先來看下Java體系中的三種編譯方式:前端編譯、即時編譯(JIT編譯)、靜態提前編譯(AOT編譯),先來瞭解它們各有什麼優點和缺點,再來看看主流的前端編譯+JIT編譯方式的運作過程。

1、前端編譯

       把Java源碼檔案(.java)編譯成Class檔案(.class)的過程;

       也即把滿足Java語言規範的程式轉化為滿足JVM規範所要求格式的功能;

優點:

這階段的最佳化是指程式編碼方面的;

許多Java文法新特性("文法糖":泛型、內部類等等),是靠前端編譯器實現的,而不是依賴虛擬機器;

編譯成的Class檔案可以直接給JVM解譯器解釋執行,省去編譯時間,加快啟動速度;

缺點:

對代碼運行效率幾乎沒有任何最佳化措施;

解釋執行效率較低,所以需要結合下面的JIT編譯;    

前端編譯器:Oracle javac、Eclipse JDT中的增量式編譯器(ECJ)等;

2、後端編譯/即時(JIT)編譯

      通過Java虛擬機器(JVM)內建的即時編譯器(Just In Time Compiler,JIT編譯器);在運行時把Class檔案位元組碼編譯成本地機器碼的過程;            

優點:

通過在運行時收集監控資訊,把"熱點代碼"(Hot Spot Code)編譯成與本地平台相關的機器碼,並進行各種層次的最佳化;

可以大大提高執行效率;

缺點:

收集監控資訊影響程式運行;

編譯過程佔用程式已耗用時間(如使得啟動速度變慢);

編譯機器碼佔用記憶體;

JIT編譯器:HotSpot虛擬機器的C1、C2編譯器等;

 

另外,JIT編譯速度及編譯結果的優劣,是衡量一個JVM效能的很重要指標;

所以對程式運行效能最佳化集中到這個階段;

也就是說可以對這個階段進行JVM調優;

3、靜態提前編譯(Ahead Of Time,AOT編譯)

       程式運行前,直接把Java源碼檔案(.java)編譯成本地機器碼的過程;

優點:

編譯不佔用已耗用時間,可以做一些較耗時的最佳化,並可加快程式啟動;

把編譯的本地機器碼儲存磁碟,不佔用記憶體,並可多次使用;

缺點:

因為Java語言的動態性(如反射)帶來了額外的複雜性,影響了靜態編譯代碼的品質;

一般靜態編譯不如JIT編譯的品質,這種方式用得比較少;

靜態提前編譯器(AOT編譯器):JAOTC、GCJ、Excelsior JET、ART (Android Runtime)等;

Java三種編譯方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.