簡單瞭解Java程式執行整體流程
阿新 • • 發佈:2020-07-06
概述
Java程式從建立原始檔到程式執行要經歷兩個主要步驟:
- 原始檔 編譯器編譯> 位元組碼檔案(ByteCode)。
- 位元組碼檔案 JVM解釋執行> 在記憶體中執行
Java程式從編譯到執行
示例程式:
public class ClassA{ public static void main(String[] args){ ClassB b = new ClassB("b"); b.method(); } } class ClassB{ private String name; public ClassB(String name){ this.name = name; } public void method(){ System.out.println("ClassB method()"); } }
編譯
- 原始檔被編譯成.class檔案。
- 若一個類所依賴的類還沒有編譯,則先編譯被依賴的類,然後引用。
- 若已編譯,則直接引用。
- 若找不到指定類的檔案,則丟擲cannot find symbol錯誤。
- 編譯後生成的位元組碼檔案由兩部分組成:
- 常量池:程式碼中的所有token(類名,成員變數名)和符號引用(方法引用,成員變數引用)
- 方法位元組碼:類中各個方法的位元組碼。
執行
Java類的執行過程:
- 類的載入
- 類的執行
注:
JVM在程式第一次主動使用類的時候才載入類,而不是一開始將所有的類都載入到記憶體中,只加載一次。
詳細步驟:
- 系統啟動一個JVM程序,JVM從classpath路徑中查詢對應的位元組碼檔案,將對應的類資訊載入到執行時資料區的方法區內(類的載入)。
- JVM找到類的主函式入口,執行main函式。
- 若需建立物件,而方法區沒有該類的資訊,則載入對應的類,並把類資訊放入方法區。
- 載入所需的類後,JVM在堆區中為例項物件分配記憶體,並呼叫建構函式初始化例項。(該例項有指向方法區對應類的類資訊的引用)
- 當呼叫例項的方法時,JVM由物件引用找到堆中的物件,再由物件持有的引用定位到方法區中類的型別資訊的方法表,從而獲得待呼叫函式的位元組碼的地址。
- 開始執行呼叫的函式。
注:
- public和protected的例項方法採用動態繫結機制:要用到方法表。
- private,static,構造器和初始化方法採用靜態繫結機制:不需要方法表。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。