Java程式碼編譯和執行的整個過程

cutesource發表於2016-02-13

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

Java程式碼編譯和執行的整個過程

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

Java程式碼編譯和執行的整個過程

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

  • Java原始碼編譯機制
  • 類載入機制
  • 類執行機制

Java原始碼編譯機制

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

  • 分析和輸入到符號表
  • 註解處理
  • 語義分析和生成class檔案

流程圖如下所示:

Java程式碼編譯和執行的整個過程

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

  • 結構資訊。包括class檔案格式版本號及各部分的數量與大小的資訊
  • 後設資料。對應於Java原始碼中宣告與常量的資訊。包含類/繼承的超類/實現的介面的宣告資訊、域與方法宣告資訊和常量池
  • 方法資訊。對應Java原始碼中語句和表示式對應的資訊。包含位元組碼、異常處理器表、求值棧與區域性變數區大小、求值棧的型別記錄、除錯符號資訊

類載入機制

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

Java程式碼編譯和執行的整個過程

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

Java程式碼編譯和執行的整個過程

相關文章