淺談Java文件被執(zhí)行的歷程
Java的編譯過(guò)程
Java程序從源文件創(chuàng)建到程序運(yùn)行要經(jīng)過(guò)兩大步驟
1、源文件由編譯器編譯成字節(jié)碼(ByteCode)
2、字節(jié)碼由java虛擬機(jī)解釋運(yùn)行。因?yàn)閖ava程序既要編譯同時(shí)也要經(jīng)過(guò)JVM的解釋運(yùn)行,所以說(shuō)Java被稱為半解釋語(yǔ)言("semi-interpreted" language)。
一個(gè)例子
下面我們通過(guò)一個(gè)簡(jiǎn)單的 OneTest.java,來(lái)看一下一個(gè)java文件從編譯到運(yùn)行的歷程。
Public class OneTest{ public static void main(String[] args){ Person one = new Person(); one.say(); } }
Public class Person{ private String name; public void say(){ System.out.println("I `m a Person"); } }
這里是兩個(gè)java文件,分別是OneTest.java,Person.java
第一步
首先是編譯階段,由JVM編譯器,將OneTest.java文件進(jìn)行編譯,得到字節(jié)碼文件(OneTest.class),這里我們發(fā)現(xiàn),OneTest.java中依賴了Person對(duì)象,也就是需要Person.java文件,編譯器便會(huì)檢索Persion.java是否被編譯(是否存在Person.class),若不存在,則先編譯Person.java,java編譯一個(gè)類時(shí),如果這個(gè)類所依賴的類還沒(méi)有被編譯,編譯器會(huì)自動(dòng)的先編譯這個(gè)所依賴的類,然后引用。
1、如果java編譯器在指定的目錄下找不到該類所依賴的類的 .class文件或者 .java源文件,就會(huì)報(bào)“Cant found sysbol”的異常錯(cuò)誤。
2、編譯后的字節(jié)碼文件格式主要分為兩部分:常量池和方法字節(jié)碼。
常量池記錄的是代碼出現(xiàn)過(guò)的常量、類名、成員變量(Person.java中的類Person名、name成員變量)等以及符號(hào)引用(類引用、方法引用(OneTest.java中的person.say),成員變量引用等);方法字節(jié)碼中放的是各個(gè)方法的字節(jié)碼。
第二步
然后進(jìn)行解釋運(yùn)行階段,這里運(yùn)行階段分為兩步:類的加載和類的執(zhí)行
JVM主要在程序第一次主動(dòng)使用類的時(shí)候,才會(huì)去加載該類。也就是說(shuō),JVM并不是在一開(kāi)始就把一個(gè)程序就所有的類都加載到內(nèi)存中,而是到不得不用的時(shí)候才把它加載進(jìn)來(lái),而且只加載一次。
1、OneTest類的加載:在類路徑下找到編譯好的 java 程序中;得到 OneTest.class 字節(jié)碼文件后,系統(tǒng)就會(huì)啟動(dòng)一個(gè) JVM 進(jìn)程,JVM進(jìn)程從classpath路徑下找到一個(gè)名為OneTest.class的二進(jìn)制文件,將OneTest.class文件中的類信息加載到運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)中,這一過(guò)程叫做類的加載。(只有類信息在方法區(qū)中,才能創(chuàng)建對(duì)象,使用類中的成員變量)關(guān)于類的加載器
2、運(yùn)行OneTest.java中的main方法:main函數(shù)的第一條命令是Persion person = new Person();就是讓JVM創(chuàng)建一個(gè)Person對(duì)象,但是這時(shí)候方法區(qū)中沒(méi)有Person類的信息,所以JVM馬上加載Person類,把Person類的類型信息放到方法區(qū)中。
3、加載完P(guān)erson類之后,Java虛擬機(jī)做的第一件事情就是在堆區(qū)中為一個(gè)新的Person實(shí)例分配內(nèi)存, 然后調(diào)用構(gòu)造函數(shù)初始化Person實(shí)例,這個(gè)Person實(shí)例持有著指向方法區(qū)的Person類的類型信息(其中包含有方法表,java動(dòng)態(tài)綁定的底層實(shí)現(xiàn))的引用
4、當(dāng)使用person.say()的時(shí)候,JVM根據(jù)person引用找到Person對(duì)象,然后根據(jù)Person對(duì)象持有的引用定位到方法區(qū)中Person類的類型信息的方法表,獲得say()函數(shù)的字節(jié)碼的地址。
5、執(zhí)行say方法。
以上就是淺談Java文件被執(zhí)行的歷程的詳細(xì)內(nèi)容,更多關(guān)于Java文件被執(zhí)行的歷程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java程序執(zhí)行過(guò)程及內(nèi)存機(jī)制詳解
- Java初始化塊及執(zhí)行過(guò)程解析
- 詳解java中finalize的實(shí)現(xiàn)與相應(yīng)的執(zhí)行過(guò)程
- 詳解java中Reference的實(shí)現(xiàn)與相應(yīng)的執(zhí)行過(guò)程
- Java中for循環(huán)的執(zhí)行過(guò)程分析
- java 異常被catch后 將會(huì)繼續(xù)執(zhí)行的操作
- java多線程中執(zhí)行多個(gè)程序的實(shí)例分析
- Java如果在try里面執(zhí)行return還會(huì)不會(huì)執(zhí)行finally
- Java使用多線程異步執(zhí)行批量更新操作方法
相關(guān)文章
Java應(yīng)用注冊(cè)成Windows服務(wù)實(shí)現(xiàn)自啟的教程詳解
這篇文章主要給大家介紹了Java應(yīng)用注冊(cè)成Windows服務(wù)實(shí)現(xiàn)自啟的教程,文中有詳細(xì)的代碼示例和圖文講解供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-02-02MyBatis使用級(jí)聯(lián)操作解決lombok構(gòu)造方法識(shí)別失敗問(wèn)題
這篇文章主要介紹了MyBatis使用級(jí)聯(lián)操作解決lombok構(gòu)造方法識(shí)別失敗問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java中sleep()與wait()的區(qū)別總結(jié)
因?yàn)樽罱鼘W(xué)習(xí)時(shí)正好碰到這兩個(gè)方法,就查閱相關(guān)資料,并通過(guò)程序?qū)崿F(xiàn),進(jìn)行區(qū)別總結(jié)一下,所以下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java中sleep()與wait()區(qū)別的相關(guān)資料,需要的朋友可以參考,下面來(lái)一起看看吧。2017-05-05Idea中添加Maven項(xiàng)目支持scala的詳細(xì)步驟
這篇文章主要介紹了Idea中添加Maven項(xiàng)目支持scala,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03springboot prototype設(shè)置多例不起作用的解決操作
這篇文章主要介紹了springboot prototype設(shè)置多例不起作用的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Java中LinkedList和ArrayList的效率分析
本文主要介紹了Java中LinkedList和ArrayList的效率分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Java實(shí)現(xiàn)矩陣順時(shí)針旋轉(zhuǎn)90度的示例
今天小編就為大家分享一篇Java實(shí)現(xiàn)矩陣順時(shí)針旋轉(zhuǎn)90度的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Java性能優(yōu)化之關(guān)于大對(duì)象復(fù)用的目標(biāo)和注意點(diǎn)
這篇文章主要介紹了Java性能優(yōu)化之關(guān)于大對(duì)象復(fù)用的目標(biāo)和注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03JAVA基于PDF box將PDF轉(zhuǎn)為圖片的實(shí)現(xiàn)方法
這篇文章主要介紹了JAVA基于PDF box將PDF轉(zhuǎn)為圖片的操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07java實(shí)現(xiàn)根據(jù)ip地址獲取地理位置
本文給大家匯總介紹了2種分別使用新浪和淘寶接口,實(shí)現(xiàn)根據(jù)IP地址獲取詳細(xì)的地理位置的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。2016-03-03