Java 程式的執行過程
Tips:
對於java程式的執行的過程,參考了兩張圖片來理解,並主要參照圖2進行講解!(這裡不對具體的內容進行詳細講解,對於具體的內容,將給出參考的連結)
圖 1:JVM Model
圖 2:Java 執行流程
java的執行可以分為編譯和執行兩個階段,分別對應著圖2的左側和右側部分這部分我們將側重執行階段的介紹。
- 編譯:將合法的
.java
檔案翻譯成位元組碼(bytecode)檔案.class
。其中包含著檢查、分析(詞法,語法,語義),最佳化等流程。
https://www.cnblogs.com/code-duck/p/13568092.html - 執行:執行階段的整個流程可以分為載入階段(loader),連結階段(linking),初始化階段(intialization)、解釋執行階段(interpreter)。參照圖 1的JVM模型,可知,載入、連結、初始化和解釋執行之間是透過執行時資料區域進行互動的(runtime data area)
- 載入階段:將位元組碼檔案加入到記憶體中JVM的方法區(Methods Area)。
- 連結階段:主要包含驗證(保證載入類的正確性)、準備(為類變數分配記憶體並設定類變數的初始值)、解析(將常量池中的符號引用替換為直接引用)三個階段。
- 初始化階段:若該類具有超類,則對其進行初始化,執行靜態初始化器(成員變數也會被初始化)。
Tip:
載入、連結、初始化的詳細瞭解可以參考如下連結:
https://blog.csdn.net/qq_32238611/article/details/114546719
關於JVM方法區維護的類資訊及其他區域維護的資訊可以參考如下連結:
https://blog.csdn.net/yfqnihao/article/details/8289363
- 執行階段:JVM將定位
public static void main(String[] args)
,JVM按照main()
方法的程式碼進行逐行執行。
Tips:
- JVM記憶體簡單介紹:
方法區:在載入階段,只將類載入到方法區(故方法區中還包含常量池等),
堆:具體例項的建立是在程式執行時(例項建立被放在堆記憶體中)
棧:方法執行過程中的區域性變數
PC暫存器:記錄程式執行的位置。
本地方法棧:指使用到的本地方法。
①PC暫存器、本地放法棧和棧 是執行緒對立的。
②JVM在作業系統層面為作業系統的堆區,因此可以實現捕獲異常等優勢
2. 解釋執行過程
解釋執行包含JIT、AOT等諸多技巧,但是不同的技巧有著不同的優勢和應用場景。
Blog Reference
https://www.cnblogs.com/linj7/p/14122919.html
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.1
https://javaguide.cn/java/basis/java-basic-questions-01.html#什麼是位元組碼-採用位元組碼的好處是什麼
LLM Question
https://poe.com/chat