1. 程式人生 > >Java 程式碼編譯和執行的整個過程

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

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

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

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

Java 原始碼編譯機制

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

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

流程圖如下所示:

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

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

類載入機制

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 已載入就視為已載入此類,保證此類只所有 ClassLoade r載入一次。而載入的順序是自頂向下,也就是由上層來逐層嘗試載入此類。

類執行機制

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

 

from: http://wiki.jikexueyuan.com/project/java-vm/java-debug.html