最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java文件被執(zhí)行的歷程

 更新時(shí)間:2021年06月01日 09:38:38   作者:糖拌西紅柿  
學(xué)習(xí)java以來,都是以語法,類庫入手,最基本的也是最基礎(chǔ)的java編譯過程往往被我遺忘,先解釋一下學(xué)習(xí)java第一課時(shí),都聽到過的一句話,“java是半解釋語言”。什么是半解釋語言。本文將介紹Java文件被執(zhí)行的歷程。

Java的編譯過程

Java程序從源文件創(chuàng)建到程序運(yùn)行要經(jīng)過兩大步驟

1、源文件由編譯器編譯成字節(jié)碼(ByteCode)

2、字節(jié)碼由java虛擬機(jī)解釋運(yùn)行。因?yàn)閖ava程序既要編譯同時(shí)也要經(jīng)過JVM的解釋運(yùn)行,所以說Java被稱為半解釋語言("semi-interpreted" language)。

一個(gè)例子

下面我們通過一個(gè)簡單的 OneTest.java,來看一下一個(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è)類所依賴的類還沒有被編譯,編譯器會(huì)自動(dòng)的先編譯這個(gè)所依賴的類,然后引用。

1、如果java編譯器在指定的目錄下找不到該類所依賴的類的 .class文件或者 .java源文件,就會(huì)報(bào)“Cant found sysbol”的異常錯(cuò)誤。

2、編譯后的字節(jié)碼文件格式主要分為兩部分:常量池和方法字節(jié)碼。
常量池記錄的是代碼出現(xiàn)過的常量、類名、成員變量(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ì)去加載該類。也就是說,JVM并不是在一開始就把一個(gè)程序就所有的類都加載到內(nèi)存中,而是到不得不用的時(shí)候才把它加載進(jìn)來,而且只加載一次。

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ū)中,這一過程叫做類的加載。(只有類信息在方法區(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ū)中沒有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)文章!

相關(guān)文章

  • java在linux系統(tǒng)下開機(jī)啟動(dòng)無法使用sudo命令的原因及解決辦法

    java在linux系統(tǒng)下開機(jī)啟動(dòng)無法使用sudo命令的原因及解決辦法

    每次開機(jī)自動(dòng)啟動(dòng)的java進(jìn)程,頁面上的關(guān)機(jī)按鈕都無法實(shí)現(xiàn)關(guān)機(jī)功能,但是此時(shí)如果以chb賬號(hào)通過ssh登錄該服務(wù)器,手動(dòng)殺掉tomcat進(jìn)程,然后再重新啟動(dòng)tomcat,頁面上的關(guān)機(jī)按鈕就有效了
    2013-08-08
  • Java轉(zhuǎn)JSON串的幾種方式

    Java轉(zhuǎn)JSON串的幾種方式

    本文給大家總結(jié)一下java轉(zhuǎn)json串的幾種方式,每種方式通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • Java8的常用時(shí)間api實(shí)用指南

    Java8的常用時(shí)間api實(shí)用指南

    這篇文章主要給大家介紹了關(guān)于Java8的常用時(shí)間api的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • springboot3.x版本集成log4j遇到Logging?system?failed?to?initialize?using?configuration?from‘classpath:log4問題

    springboot3.x版本集成log4j遇到Logging?system?failed?to?initial

    使用Springboot?3.x集成Log4j時(shí)可能會(huì)遇到版本沖突的問題,這通??梢酝ㄟ^檢查Maven依賴樹來識(shí)別,一旦發(fā)現(xiàn)沖突,將Log4j的版本統(tǒng)一更新到最新的兼容版本,例如2.21.1,即可解決問題,此方法有效解決了日志打印錯(cuò)誤,是處理類似問題的一個(gè)實(shí)用參考
    2024-09-09
  • java9新特性Collection集合類的增強(qiáng)與優(yōu)化方法示例

    java9新特性Collection集合類的增強(qiáng)與優(yōu)化方法示例

    這篇文章主要為大家介紹了java9新特性Collection集合類的增強(qiáng)與優(yōu)化方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • 淺談一下Java中的悲觀鎖和樂觀鎖

    淺談一下Java中的悲觀鎖和樂觀鎖

    這篇文章主要介紹了一下Java中的悲觀鎖和樂觀鎖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java實(shí)現(xiàn)無損Word轉(zhuǎn)PDF的示例代碼

    Java實(shí)現(xiàn)無損Word轉(zhuǎn)PDF的示例代碼

    本文將利用Java中的兩個(gè)jar包:pdfbox和aspose-words實(shí)現(xiàn)無損Word轉(zhuǎn)PDF功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-06-06
  • 編寫調(diào)用新浪微博API的Java程序來發(fā)送微博

    編寫調(diào)用新浪微博API的Java程序來發(fā)送微博

    這篇文章主要介紹了編寫調(diào)用新浪微博API的Java程序來發(fā)送微博的方法,只是展示了一個(gè)基本的程序框架而非一個(gè)完整的圖形化軟件:)需要的朋友可以參考下
    2015-11-11
  • mybatisplus的邏輯刪除問題

    mybatisplus的邏輯刪除問題

    這篇文章主要介紹了mybatisplus的邏輯刪除問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Seata?AT模式啟動(dòng)過程圖文示例詳解

    Seata?AT模式啟動(dòng)過程圖文示例詳解

    這篇文章主要為大家介紹了Seata?AT模式啟動(dòng)過程圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

丹江口市| 临潭县| 曲麻莱县| 珠海市| 怀集县| 客服| 汝城县| 乌鲁木齐县| 井研县| 曲松县| 大厂| 荃湾区| 桃园市| 临江市| 阳泉市| 论坛| 嘉善县| 青龙| 宝丰县| 班戈县| 巴彦淖尔市| 庆云县| 尼木县| 乡城县| 舟山市| 滨州市| 美姑县| 安溪县| 东至县| 博湖县| 镇康县| 平凉市| 城固县| 铁力市| 土默特右旗| 资兴市| 高唐县| 鄂尔多斯市| 独山县| 丰镇市| 辽中县|