【死磕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),程式計算器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次呼叫,而棧幀又是有全域性變數區和運算元棧兩部分組成,區域性變數區用於存放方法中的區域性變數和引數,運算元棧中用於存放方法執行過程中產生的中間結果。
棧的結構圖如下所示: