總編譯流程
源碼--javac->字節(jié)碼文件-->被加載到JVM-->JIT-->機器碼文件-->操作系統(tǒng)執(zhí)行
前期 后期
1.前端編譯器 2.后端編譯器
可通過java解釋器解釋執(zhí)行 即時編譯器
3.AOT 編譯器:一步到位,源代碼到機器碼
一般是前后端編譯器混合使用,前期編譯成字節(jié)碼,后期編譯成機器碼,AOT用的比較少。
相關問答
- 當源代碼轉(zhuǎn)化為字節(jié)碼之后,其實要運行程序,有兩種選擇。一種是使用 Java 解釋器解釋執(zhí)行字節(jié)碼,另一種則是使用 JIT 編譯器將字節(jié)碼轉(zhuǎn)化為本地機器代碼。
- 前者啟動速度快但運行速度慢,而后者啟動速度慢但運行速度快。
- javac是前端編譯器,java是與javac相對的解釋器,解釋執(zhí)行javac編譯成的字節(jié)碼
- 解釋器不需要像 JIT編譯器一樣,將所有字節(jié)碼都轉(zhuǎn)化為機器碼,自然就少去了優(yōu)化的時間。而當 JIT 編譯器完成第一次編譯后,其會將字節(jié)碼對應的機器碼保存下來,下次可以直接使用。
- 機器碼的運行效率肯定是高于 Java 解釋器的。所以在實際情況中,為了運行速度以及效率,我們通常采用兩者相結合的方式進行 Java 代碼的編譯執(zhí)行。
- HotSpot 虛擬機內(nèi)置了兩個即時編譯器(統(tǒng)稱JIT編譯器),分別稱為 Client Compiler 和Server Compiler。這兩種不同的編譯器衍生出兩種不同的編譯模式,我們分別稱之為:C1 編譯模式,C2 編譯模式。
- 那么 C1 編譯模式和 C2 編譯模式有什么區(qū)別呢?
C1 編譯模式會將字節(jié)碼編譯為本地代碼,進行簡單、可靠的優(yōu)化,如有必要將加入性能監(jiān)控的邏輯。而 C2 編譯模式,也是將字節(jié)碼編譯為本地代碼,但是會啟用一些編譯耗時較長的優(yōu)化,甚至會根據(jù)性能監(jiān)控信息進行一些不可靠的激進優(yōu)化。
簡單地說 C1 編譯模式做的優(yōu)化相對比較保守,其編譯速度相比 C2 較快。而 C2 編譯模式會做一些激進的優(yōu)化,并且會根據(jù)性能監(jiān)控做針對性優(yōu)化,所以其編譯質(zhì)量相對較好,但是耗時更長。
- 那么到底應該選擇 C1 編譯模式還是 C2 編譯模式呢?
實際上對于 HotSpot 虛擬機來說,其一共有三種運行模式可選,分別是:
混合模式(Mixed Mode) 。即 C1 和 C2 兩種模式混合起來使用,這是默認的運行模式。如果你想單獨使用 C1 模式或 C2 模式,使用 -client 或 -server 打開即可。
解釋模式(Interpreted Mode)。即所有代碼都解釋執(zhí)行,使用 -Xint 參數(shù)可以打開這個模式。
編譯模式(Compiled Mode)。 此模式優(yōu)先采用編譯,但是無法編譯時也會解釋執(zhí)行,使用 -Xcomp 打開這種模式。
在命令行中輸入 java -version 可以看到,我機器上的虛擬機使用 Mixed Mode 運行模式。
小結
前端編譯器、JIT 編譯器、AOT 編譯器。
前端編譯器,最常見的就是我們的 javac 編譯器,其將 Java 源代碼編譯為 Java 字節(jié)碼文件。JIT 即時編譯器,最常見的是 HotSpot 虛擬機中的 Client Compiler 和 Server Compiler,其將 Java 字節(jié)碼編譯為本地機器代碼。而 AOT 編譯器則能將源代碼直接編譯為本地機器碼。
編譯速度:
解釋執(zhí)行 > AOT 編譯器 > JIT 編譯器。
編譯質(zhì)量:
JIT 編譯器 > AOT 編譯器 > 解釋執(zhí)行。
而在 JVM 中,通過這幾種不同方式的配合,使得 JVM 的編譯質(zhì)量和運行速度達到最優(yōu)的狀態(tài)。
參考鏈接:
最后編輯于 :
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。