1. 程式人生 > >【死磕JVM】——-2、Java程式碼編譯和執行的整個過程

【死磕JVM】——-2、Java程式碼編譯和執行的整個過程

Java程式碼編譯是由Java原始碼編譯器來完成的,流程圖如下:


Java位元組碼的執行是由JVM執行引擎來完成的,流程圖如下:


Java程式碼編譯和執行的整個過程包含以下三個重要機制:

1.Java程式碼編譯機制。

2.類載入機制。

3.類執行機制。

Java原始碼編譯機制

Java原始碼編譯機制由以下三個過程組成:

1.分析和輸入到符號表。

2.註解處理。

3.語義分析和生成class檔案。

流程圖如下:


最後生成的class檔案由以下部分組成:

1.結構資訊。

2.元資料。

3.方法資訊。

類載入機制:

JVM人類載入是通過ClassLoader及其子類來完成的,類的層次關係和載入順序可以由下圖來描述:


1)Bootstrap ClassLoader

負責載入$JAVA_HOME中jre/lib/rt.jar裡所有的Class,由C++實現,不是ClassLoader的子類。

2)Extension ClassLoader

負責載入java平臺中擴充套件功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或 -Djava.ext.dirs指定目錄下的jar包。

3)App ClassLoader

負責記載classpath中指定的jar包及目錄中的class。

4)Custom ClassLoader

屬於應用程式根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規範自行實現ClassLoader。

載入過程中會先檢查類是否被已載入,檢查順序是自底向上,從Custom ClassLoader到Bootstrap ClassLoader逐層檢查,只要某個ClassLoader已載入就視為已載入此類,保證此類只所有ClassLoader載入一次。而載入的順序是自頂向下,也就是由上層來逐層嘗試載入此類。

類執行機制:

JVM是基於棧的體系結構來執行Class位元組碼的,執行緒建立後,都會產生程式計算器(PC)和棧(Stack),程式計算器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次呼叫,而棧幀又是有全域性變數區和運算元棧兩部分組成,區域性變數區用於存放方法中的區域性變數和引數,運算元棧中用於存放方法執行過程中產生的中間結果。 

棧的結構圖如下所示: