JVM基礎(chǔ) - 編譯執(zhí)行、平臺無關(guān)性

一、Java從編譯到執(zhí)行

Java從編譯到執(zhí)行.png

1. Java程序運行過程

如圖所示,我們的Java代碼需要通過javac編譯成.class后綴的字節(jié)碼文件,然后才能被JVM執(zhí)行。在JVM中,首先需要通過類加載器加載這個字節(jié)碼文件,然后由字節(jié)碼解釋器去解析字節(jié)碼文件,最后由執(zhí)行引擎去基于解析后的指令去操作OS硬件系統(tǒng)。

2. 什么是JIT(Just In Time Compiler)?

當虛擬機發(fā)現(xiàn)某個方法或代碼塊的運行特別頻繁的時候,就會把這些代碼認定為“熱點代碼”。為了提高熱點代碼的執(zhí)行效率,在運行時,即時編譯器JIT會把這些代碼編譯成與本地平臺相關(guān)的機器碼,并進行各種層次的優(yōu)化。

3. 解釋器和編譯器各自的優(yōu)點

解釋器的優(yōu)點:當程序需要迅速啟動的時候,解釋器可以首先發(fā)揮作用,省去了編譯的時間,立即執(zhí)行。解釋執(zhí)行占用更小的內(nèi)存空間。同時,當編譯器進行的激進優(yōu)化失敗的時候,還可以進行逆優(yōu)化來恢復(fù)到解釋執(zhí)行的狀態(tài)。
編譯器的優(yōu)點:在程序運行時,隨著時間的推移,編譯器逐漸發(fā)揮作用,把越來越多的代碼編譯成本地代碼之后,可以獲得更高的執(zhí)行效率。
結(jié)論:通常在虛擬機的架構(gòu)中,解釋器與編譯器通常會配合工作,提升效率。

二、JVM跨平臺和語言無關(guān)性

JVM跨平臺和語言無關(guān)性.png

1. JVM的跨平臺

JVM如何做到的跨平臺?
Java官方提供了各個平臺32bit和64bit的機器的不同版本的JDK,所以在各個平臺下都會有相應(yīng)的JVM。站在JVM的角度,JVM只解釋執(zhí)行字節(jié)碼文件,所以我們的Java代碼會統(tǒng)一會編譯成字節(jié)碼文件,這樣就可以在各個平臺上運行了。
簡而言之,也就是Java官方從包攬了各個平臺下JVM的開發(fā)工作,程序員不需要考慮平臺各自的接口和特性,只需要提供編譯后的class字節(jié)碼文件,這樣就可以一處編譯處處運行,達到平臺無關(guān)性(Write Once ,Run Anywhere)。

2. JVM的語言無關(guān)性

JVM只解釋執(zhí)行字節(jié)碼文件,所以無論語言是什么樣,只要最終可以編譯成字節(jié)碼文件,這樣的代碼就可以在JVM上運行。
截至目前,商業(yè)機構(gòu)和開源機構(gòu)已經(jīng)在Java語言之外發(fā)展出一大批可以在JVM上運行的語言了,如Groovy、Scala、Jython等。之所以可以支持,就是因為這些語言也可以被編譯成字節(jié)碼(.class文件),而虛擬機并不關(guān)心字節(jié)碼是有哪種語言編譯而來的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容