java代碼是如何被機(jī)器識別的?
首先,Java作為一門高級程序語言,其語法非常復(fù)雜,直接將 Java 代碼丟給機(jī)器,機(jī)器是無法識別 Java 代碼的。所以,對于Java語言來說,首先是使用編譯器將我們的 Java 源碼(.java文件)編譯成字節(jié)碼文件(.class文件),之后再使用虛擬機(jī)(JVM)將字節(jié)碼翻譯成機(jī)器碼,最后機(jī)器碼才能被機(jī)器識別并執(zhí)行。
請看下圖:
(免費學(xué)習(xí)視頻教程推薦:java視頻教程)
解釋如下:
其實 JVM 是無法直接運行字節(jié)碼文件的,JVM 需要將字節(jié)碼翻譯成機(jī)器碼才可以運行對應(yīng)的代碼邏輯。在 HotSpot 虛擬機(jī)中,有兩種翻譯形式:第一種是解釋執(zhí)行,即逐條將字節(jié)碼翻譯成機(jī)器碼并執(zhí)行;第二種是即時編譯(Just-In-Time compilation,JIT),即將一個方法中包含的所有字節(jié)碼編譯成機(jī)器碼后再執(zhí)行。這兩種方式各有優(yōu)劣。
解釋執(zhí)行的優(yōu)勢是無須等待編譯,立刻可以運行。而即時編譯的優(yōu)勢在于實際運行速度更快。在 HotSpot 虛擬機(jī)中默認(rèn)采用混合模式,綜合了解釋執(zhí)行和即時編譯兩者的優(yōu)點。它會先解釋執(zhí)行字節(jié)碼,而后將其中反復(fù)執(zhí)行的熱點代碼,以方法為單位進(jìn)行即時編譯。
Java 虛擬機(jī)執(zhí)行 Java 字節(jié)碼的時候,首先會將字節(jié)碼文件加載到內(nèi)存中,之后將加載后的 Java 類存放到方法區(qū)(Method Area)中。實際運行時,虛擬機(jī)會執(zhí)行方法區(qū)中的代碼。
在運行過程中,每次進(jìn)入一個 Java 方法,Java 虛擬機(jī)會在當(dāng)前線程的 Java 方法棧中生成一個棧幀,用以存放局部變量以及字節(jié)碼操作數(shù)。當(dāng)退出當(dāng)前執(zhí)行方法時,無論正常返回還是異常返回,Java 虛擬機(jī)都會彈出當(dāng)前線程的當(dāng)前棧幀,將其丟棄。
相關(guān)文章教程推薦:java入門教程