簡(jiǎn)單了解Java程序運(yùn)行整體流程
概述
Java程序從創(chuàng)建源文件到程序運(yùn)行要經(jīng)歷兩個(gè)主要步驟:
- 源文件 編譯器編譯> 字節(jié)碼文件(ByteCode)。
- 字節(jié)碼文件 JVM解釋運(yùn)行> 在內(nèi)存中運(yùn)行
Java程序從編譯到運(yùn)行
示例程序:
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文件。
- 若一個(gè)類所依賴的類還沒(méi)有編譯,則先編譯被依賴的類,然后引用。
- 若已編譯,則直接引用。
- 若找不到指定類的文件,則拋出cannot find symbol錯(cuò)誤。
- 編譯后生成的字節(jié)碼文件由兩部分組成:
- 常量池:代碼中的所有token(類名,成員變量名)和符號(hào)引用(方法引用,成員變量引用)
- 方法字節(jié)碼:類中各個(gè)方法的字節(jié)碼。
運(yùn)行
Java類的運(yùn)行過(guò)程:
- 類的加載
- 類的執(zhí)行
注:
JVM在程序第一次主動(dòng)使用類的時(shí)候才加載類,而不是一開(kāi)始將所有的類都加載到內(nèi)存中,只加載一次。
詳細(xì)步驟:
- 系統(tǒng)啟動(dòng)一個(gè)JVM進(jìn)程,JVM從classpath路徑中查找對(duì)應(yīng)的字節(jié)碼文件,將對(duì)應(yīng)的類信息加載到運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)(類的加載)。
- JVM找到類的主函數(shù)入口,執(zhí)行main函數(shù)。
- 若需創(chuàng)建對(duì)象,而方法區(qū)沒(méi)有該類的信息,則加載對(duì)應(yīng)的類,并把類信息放入方法區(qū)。
- 加載所需的類后,JVM在堆區(qū)中為實(shí)例對(duì)象分配內(nèi)存,并調(diào)用構(gòu)造函數(shù)初始化實(shí)例。(該實(shí)例有指向方法區(qū)對(duì)應(yīng)類的類信息的引用)
- 當(dāng)調(diào)用實(shí)例的方法時(shí),JVM由對(duì)象引用找到堆中的對(duì)象,再由對(duì)象持有的引用定位到方法區(qū)中類的類型信息的方法表,從而獲得待調(diào)用函數(shù)的字節(jié)碼的地址。
- 開(kāi)始執(zhí)行調(diào)用的函數(shù)。
注:
- public和protected的實(shí)例方法采用動(dòng)態(tài)綁定機(jī)制:要用到方法表。
- private,static,構(gòu)造器和初始化方法采用靜態(tài)綁定機(jī)制:不需要方法表。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java中ArrayList和LinkedList之間的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java中ArrayList和LinkedList之間的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Mybatis-plus動(dòng)態(tài)條件查詢QueryWrapper的使用案例
mybatis-plus框架功能很強(qiáng)大,把很多功能都集成了,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus動(dòng)態(tài)條件查詢QueryWrapper的使用教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Springboot Druid 自定義加密數(shù)據(jù)庫(kù)密碼的幾種方案
這篇文章主要介紹了Springboot Druid 自定義加密數(shù)據(jù)庫(kù)密碼的步驟,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下2020-12-12
如何避免在Java項(xiàng)目里大批量使用if-else?
想起剛開(kāi)始接觸JAVA時(shí),若遇到大量流程判斷語(yǔ)句,幾乎滿屏都是if-else語(yǔ)句,多得讓自己都忘了哪里是頭,哪里是尾,但是,縱然滿屏是if-else,但彼時(shí)也沒(méi)有覺(jué)得多別扭.等到編程能力漸漸提升之后,再回過(guò)頭去看曾經(jīng)寫(xiě)過(guò)的滿屏if-else時(shí),感覺(jué)全都是翔.....,需要的朋友可以參考下2021-06-06
Java之SpringBoot集成ActiveMQ消息中間件案例講解
這篇文章主要介紹了Java之SpringBoot集成ActiveMQ消息中間件案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能
這篇文章主要為大家詳細(xì)介紹了Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
MyBatis?詳細(xì)講解動(dòng)態(tài)?SQL的使用
動(dòng)態(tài)?SQL?是?MyBatis?的強(qiáng)大特性之一。如果你使用過(guò)?JDBC?或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接?SQL?語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài)?SQL,可以徹底擺脫這種痛苦2022-04-04
Springmvc國(guó)際化自動(dòng)配置代碼實(shí)現(xiàn)
這篇文章主要介紹了Springmvc國(guó)際化自動(dòng)配置代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

