簡單了解Java程序運行整體流程
更新時間:2020年07月03日 16:03:41 作者:Tim_Bergling
這篇文章主要介紹了簡單了解Java程序運行整體流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
概述
Java程序從創(chuàng)建源文件到程序運行要經(jīng)歷兩個主要步驟:
- 源文件 編譯器編譯> 字節(jié)碼文件(ByteCode)。
- 字節(jié)碼文件 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錯誤。
- 編譯后生成的字節(jié)碼文件由兩部分組成:
- 常量池:代碼中的所有token(類名,成員變量名)和符號引用(方法引用,成員變量引用)
- 方法字節(jié)碼:類中各個方法的字節(jié)碼。
運行
Java類的運行過程:
- 類的加載
- 類的執(zhí)行
注:
JVM在程序第一次主動使用類的時候才加載類,而不是一開始將所有的類都加載到內存中,只加載一次。
詳細步驟:
- 系統(tǒng)啟動一個JVM進程,JVM從classpath路徑中查找對應的字節(jié)碼文件,將對應的類信息加載到運行時數(shù)據(jù)區(qū)的方法區(qū)內(類的加載)。
- JVM找到類的主函數(shù)入口,執(zhí)行main函數(shù)。
- 若需創(chuàng)建對象,而方法區(qū)沒有該類的信息,則加載對應的類,并把類信息放入方法區(qū)。
- 加載所需的類后,JVM在堆區(qū)中為實例對象分配內存,并調用構造函數(shù)初始化實例。(該實例有指向方法區(qū)對應類的類信息的引用)
- 當調用實例的方法時,JVM由對象引用找到堆中的對象,再由對象持有的引用定位到方法區(qū)中類的類型信息的方法表,從而獲得待調用函數(shù)的字節(jié)碼的地址。
- 開始執(zhí)行調用的函數(shù)。
注:
- public和protected的實例方法采用動態(tài)綁定機制:要用到方法表。
- private,static,構造器和初始化方法采用靜態(tài)綁定機制:不需要方法表。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
java.lang.ClassCastException的問題解決
本文主要介紹了java.lang.ClassCastException的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06java 定時器Timer和TimerTask的使用詳解(執(zhí)行和暫停)
這篇文章主要介紹了java 定時器Timer和TimerTask的使用詳解(執(zhí)行和暫停),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法
這篇文章主要介紹了java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法,涉及Java元素遍歷與數(shù)學運算的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11