大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java程序編譯和運行的過程

Java程序編譯和運行的過程

更新時間:2019-08-22 11:09:09 來源:動力節(jié)點 瀏覽3504次

Java整個編譯以及運行的過程相當繁瑣,本文通過一個簡單的程序來簡單的說明整個流程。

如下圖,Java程序從源文件創(chuàng)建到程序運行要經(jīng)過兩大步驟:

  1. 源文件由編譯器編譯成字節(jié)碼(ByteCode)
  2. 字節(jié)碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經(jīng)過JVM的解釋運行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。

1566442455805521.png

java程序編譯運行過程

下面通過以下這個java程序,來說明java程序從編譯到最后運行的整個流程。代碼如下:

?//MainApp.java??
public class MainApp {??
? ? public static void main(String[] args) {??
? ? ? ? Animal animal = new Animal("Puppy");??
? ? ? ? animal.printName();??
? ? }??
}?
?
//Animal.java??
public class Animal {??
? ? public String name;??
? ? public Animal(String name) {??
? ? ? ? this.name = name;??
? ? }??
? ? public void printName() {??
? ? ? ? System.out.println("Animal ["+name+"]");??
? ? }??
}??

第一步(編譯): 創(chuàng)建完源文件之后,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然后引用,否則直接引用,這個有點象make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報“cant find symbol”的錯誤。

編譯后的字節(jié)碼文件格式主要分為兩部分:常量池和方法字節(jié)碼。常量池記錄的是代碼出現(xiàn)過的所有token(類名,成員變量名等等)以及符號引用(方法引用,成員變量引用等等);方法字節(jié)碼放的是類中各個方法的字節(jié)碼。下面是MainApp.class通過反匯編的結(jié)果,我們可以清楚看到.class文件的結(jié)構(gòu):

1566442638873901.png

圖2  MainApp類常量池 

1566442660794885.png

圖3  MainApp類方法字節(jié)碼

第二步(運行):java類運行的過程大概可分為兩個過程:

  • 類的加載
  • 類的執(zhí)行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去加載該類。也就是說,JVM并不是在一開始就把一個程序就所有的類都加載到內(nèi)存中,而是到不得不用的時候才把它加載進來,而且只加載一次。

下面是程序運行的詳細步驟:

  1. 在編譯好java程序得到MainApp.class文件后,在命令行上敲java AppMain。系統(tǒng)就會啟動一個jvm進程,jvm進程從classpath路徑中找到一個名為AppMain.class的二進制文件,將MainApp的類信息加載到運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi),這個過程叫做MainApp類的加載。
  2. 然后JVM找到AppMain的主函數(shù)入口,開始執(zhí)行main函數(shù)。
  3. main函數(shù)的第一條命令是Animal animal = new Animal("Puppy");就是讓JVM創(chuàng)建一個Animal對象,但是這時候方法區(qū)中沒有Animal類的信息,所以JVM馬上加載Animal類,把Animal類的類型信息放到方法區(qū)中。
  4. 加載完Animal類之后,Java虛擬機做的第一件事情就是在堆區(qū)中為一個新的Animal實例分配內(nèi)存, 然后調(diào)用構(gòu)造函數(shù)初始化Animal實例,這個Animal實例持有著指向方法區(qū)的Animal類的類型信息(其中包含有方法表,java動態(tài)綁定的底層實現(xiàn))的引用。
  5. 當使用animal.printName()的時候,JVM根據(jù)animal引用找到Animal對象,然后根據(jù)Animal對象持有的引用定位到方法區(qū)中Animal類的類型信息的方法表,獲得printName()函數(shù)的字節(jié)碼的地址。
  6. 開始運行printName()函數(shù)

1566443077743362.png

  圖4 java程序運行過程

特別說明:java類中所有public和protected的實例方法都采用動態(tài)綁定機制,所有私有方法、靜態(tài)方法、構(gòu)造器及初始化方法都是采用靜態(tài)綁定機制。而使用動態(tài)綁定機制的時候會用到方法表,靜態(tài)綁定時并不會用到。本文只是講述java程序運行的大概過程,所以并沒有細加區(qū)分。本文的所述的流程非常粗糙,想深入了解的學員在線咨詢,有專業(yè)老師為你提供免費的學習資料。

以上內(nèi)容相關(guān)免費視頻教程下載:

http://www.dabaquan.cn/xiazai/2732.html

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 午夜色综合 | 老司机福利在线播放 | 国产一区二区影院 | 91aaa免费观看在线观看资源 | 99视频在线观看免费 | 日韩在线a视频免费播放 | 97色老99久久九九爱精品 | 日韩亚洲欧洲在线rrrr片 | 亚洲一区二区影院 | 四虎影视在线观看2022a | 九九精品热线免费观看6 | 午夜影院毛片 | 天天色综合三 | 久久亚洲不卡一区二区 | 亚洲线精品久久一区二区三区 | 一级毛片视频免费 | 国产成人18黄网站免费 | 亚洲精品视频在线观看视频 | 曰本一区二区 | 在线观看色| 国产亚洲精品国产 | 伊人网综合 | 在线精品中文字幕福利视频 | 国产精品综合久成人 | 国产成人精品第一区二区 | 亚洲特级片| 欧美日韩激情在线 | 国产精品视频免费看 | 国产高清免费 | 四虎影视4hu4虎成人 | 四虎永久在线 | 四虎自拍| 91久久精品日日躁夜夜躁欧美 | 久青草香蕉精品视频在线 | 国产在线精彩视频二区 | 伦理一区二区 | 日韩精品福利视频一区二区三区 | 成人国产一区二区三区精品 | 在线观看一级毛片免费 | 亚洲国产精品自产拍在线播放 | 亚洲图片天堂 |