簡單了解Java程序運行整體流程
更新時間:2020年07月03日 16:03:41 作者:Tim_Bergling
這篇文章主要介紹了簡單了解Java程序運行整體流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
概述
Java程序從創(chuà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é)碼文件,將對應的類信息加載到運行時數據區(qū)的方法區(qū)內(類的加載)。
- JVM找到類的主函數入口,執(zhí)行main函數。
- 若需創(chuàng)建對象,而方法區(qū)沒有該類的信息,則加載對應的類,并把類信息放入方法區(qū)。
- 加載所需的類后,JVM在堆區(qū)中為實例對象分配內存,并調用構造函數初始化實例。(該實例有指向方法區(qū)對應類的類信息的引用)
- 當調用實例的方法時,JVM由對象引用找到堆中的對象,再由對象持有的引用定位到方法區(qū)中類的類型信息的方法表,從而獲得待調用函數的字節(jié)碼的地址。
- 開始執(zhí)行調用的函數。
注:
- public和protected的實例方法采用動態(tài)綁定機制:要用到方法表。
- private,static,構造器和初始化方法采用靜態(tài)綁定機制:不需要方法表。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java中ArrayList和LinkedList之間的區(qū)別_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Java中ArrayList和LinkedList之間的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
Mybatis-plus動態(tài)條件查詢QueryWrapper的使用案例
mybatis-plus框架功能很強大,把很多功能都集成了,下面這篇文章主要給大家介紹了關于Mybatis-plus動態(tài)條件查詢QueryWrapper的使用教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-07-07
Springboot Druid 自定義加密數據庫密碼的幾種方案
這篇文章主要介紹了Springboot Druid 自定義加密數據庫密碼的步驟,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下2020-12-12
Java之SpringBoot集成ActiveMQ消息中間件案例講解
這篇文章主要介紹了Java之SpringBoot集成ActiveMQ消息中間件案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07

