Java程式碼編譯和執行的整個過程
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已載入就視為已載入此類,保證此類只所有ClassLoader載入一次。而載入的順序是自頂向下,也就是由上層來逐層嘗試載入此類。
類執行機制
JVM是基於棧的體系結構來執行class位元組碼的。執行緒建立後,都會產生程式計數器(PC)和棧(Stack),程式計數器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次呼叫,而棧幀又是有區域性變數區和運算元棧兩部分組成,區域性變數區用於存放方法中的區域性變數和引數,運算元棧中用於存放方法執行過程中產生的中間結果。棧的結構如下圖所示:
相關文章
- 初探 Go 的編譯命令執行過程Go編譯
- .NET 程式碼編譯過程編譯
- Java 程式執行過程Java
- Java編譯和執行的命令Java編譯
- Maven配置外掛跳過測試程式碼的編譯和執行Maven編譯
- 一個簡單java程式的執行全過程Java
- 【開發語言】PHP、Java、C語言的編譯執行過程PHPJavaC語言編譯
- C語言的編譯連結執行過程C語言編譯
- 淺析Java程式的執行過程Java
- 圖解Java程式編譯解釋過程圖解Java編譯
- 程式碼精簡執行過程
- 編譯C++ 程式的過程編譯C++
- javascript引擎執行的過程的理解--語法分析和預編譯階段JavaScript語法分析編譯
- C語言_來了解一下GCC編譯器編譯C可執行指令碼的過程C語言GC編譯指令碼
- hadoop 編譯程式碼及執行Hadoop編譯
- Java 原始碼編譯成 Class 檔案的過程分析Java原始碼編譯
- 如果一個過程正在執行,這個時候編譯這個過程,會產生library cache pin編譯
- 無IDE時編譯和執行JavaIDE編譯Java
- 優化C++程式碼(2):C++程式碼的編譯過程優化C++編譯
- 編譯器的工作過程和原理編譯
- dos下編譯執行java程式遇到的問題編譯Java
- 無IDE下編譯和執行Java的方法IDE編譯Java
- 【Java】【轉】在命令列中編譯和執行javaJava命令列編譯
- 編譯器的編譯基本過程編譯
- 一個 java 檔案的執行過程詳解Java
- 編譯過程編譯
- 從一個案例看PL/SQL程式碼片的編譯與執行SQL編譯
- java程式碼-編譯-打包-執行_雲原生時代筆記總結Java編譯筆記
- C程式編譯過程淺析C程式編譯
- GCC編譯和連結過程GC編譯
- iOS編譯過程的原理和應用iOS編譯
- Java 編譯期和執行期Java編譯
- 如何編寫一個前端框架之三-程式碼執行沙箱(譯)前端框架
- C語言程式碼區錯誤以及編譯過程C語言編譯
- 阿里開源COLA 4.0原始碼編譯和部署過程阿里原始碼編譯
- 通過 HelloWorld 瞭解 Java 程式執行過程以及執行時記憶體Java記憶體
- Javac編譯過程Java編譯
- 編譯核心過程編譯