1.對Java平臺的理解。「Java是解釋執行」對嗎

Java自己是一種面向對象的語言,最顯著的特性有兩個方面,一是所謂的「書寫一次,處處運行」,可以很是容易地得到跨平臺能力;
另外就是垃圾收集(GC),Java經過垃圾收集器(Garbage Collector)回收分配內存,大部分狀況下,程序員不須要本身操心內存的分配和回收。
 
對於「Java是解釋執行」這句話,說法不太準確。
咱們開發的Java的源代碼,首先 經過Javac編譯成爲字節碼(bytecode),而後,在運行時,經過Java虛擬機(JVM)內嵌的解釋器將字節碼解釋執行,轉換成爲最終的機器碼
可是常見的JVM,好比咱們大多數狀況使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)編譯器,也就是一般所說的動態編譯器, JIT可以在運行時將熱點代碼編譯成機器碼,這種狀況下部分熱點代碼就屬於
編譯執行,而不是解釋執行了。
 
Javac的編譯,編譯Java源碼生成「.class」文件裏面實際是字節碼,而不是能夠直接執行的機器。
Java經過字節碼和Java虛擬機(JVM)這種跨平臺的抽象,屏蔽了操做系統和硬件的細節,這也是實現「一次編譯,處處執行」的基礎。
在運行時,JVM會經過類加載器(Class-Loader)加載字節碼,解釋或者編譯執行
 
主流Java版本中,如JDK 8實際是解釋和編譯混合的一種模式,即所謂的混合模式(-Xmixed)。
一般運行在server模式的JVM,會進行上萬次調用以收集足夠的信息進行高效的編譯,client模式這個門限是1500次。
Oracle Hotspot JVM內置了兩個不一樣的JIT compiler,C1對應前面說的client模式,適用於對於啓動速度敏感的應用,好比普通Java桌面應用;
C2對應server模式,它的優化是爲長時間運行的服務器端應用設計的。
默認是採用所謂的分層編譯(TieredCompilation)。
Java虛擬機啓動時,能夠指定不一樣的參數對運行模式進行選擇。
好比,指定「-Xint」,就是告訴JVM只進行解釋執行,不對代碼進行編譯,這種模式拋棄了JIT可能帶來的性能優點。畢竟解釋器(interpreter)是逐條讀入,逐條解釋運行的。
與其相對應的,還有一個「-Xcomp」參數,這是告訴JVM關閉解釋器,不要進行解釋執行,或者叫做最大優化級別。那你可能會問這種模式是否是最高效啊?簡單說,還真未必。「-Xcomp」會致使JVM啓動變慢很是多,同時有些
JIT編譯器優化方式,好比分支預測,若是不進行profling,每每並不能進行有效優化。
 
除了咱們平常最多見的Java使用模式,其實還有一種新的編譯方式,即所謂的AOT(Ahead-of-Time Compilation),直接將字節碼編譯成機器代碼,這樣就避免了JIT預熱等各方面的開銷,好比
Oracle JDK 9就引入了實驗性的AOT特性,而且增長了新的jaotc工具。
 
 
Java字節碼的設計充分考慮了JIT這一即時編譯方式,能夠將字節碼直接編譯成高性能的本地機器碼。
相關文章
相關標籤/搜索