大战熟女丰满人妻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://m.dabaquan.cn/xiazai/2732.html

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

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 亚洲视频在线一区二区 | 免费福利小视频 | 国产成人免费高清在线观看 | 久久久久久全国免费观看 | 天天干夜干 | 99热在线这里只有精品 | 国产亚洲精品久久久久久无 | 中文字幕欧美日韩一 | 中文字幕中文字幕在线 | 一级特黄aa大片欧美小说 | 久热只有精品 | 日韩经典欧美一区二区三区 | 欧美不卡精品中文字幕日韩 | 国产亚洲综合视频 | 91香蕉在线 | 国产精品香蕉在线一区二区 | 国产欧美亚洲精品 | 免费的毛片网站 | 五月亭亭激情五月 | 国产99久久九九精品免费 | 久久成人视 | 欧美激情亚洲激情 | 日韩精品一二三区 | 97天天干| 男任天堂2021 | 国产成 人 综合 亚洲网 | 天天干天天干天天操 | 九色视频极品论坛区 | 久久久久免费精品视频 | 中文字幕在线观看第二页 | 四虎影视永久免费观看网址 | 欧美成人四级hd版 | 九九热免费观看 | 香蕉视频成人在线观看 | 国产美女一级高清免费观看 | 成人www视频 | 12345国产精品高清在线 | 91精品国产免费久久国语麻豆 | 亚洲国产色综合有声小说 | 九九99| 婷婷视频在线观看 |