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