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這一即時編譯方式,能夠將字節碼直接編譯成高性能的本地機器碼。