亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

Java的編譯過程

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

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

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

一個例子

下面我們通過一個簡單的 OneTest.java,來看一下一個java文件從編譯到運行的歷程。

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");
   }
}

這里是兩個java文件,分別是OneTest.java,Person.java

第一步

首先是編譯階段,由JVM編譯器,將OneTest.java文件進行編譯,得到字節(jié)碼文件(OneTest.class),這里我們發(fā)現(xiàn),OneTest.java中依賴了Person對象,也就是需要Person.java文件,編譯器便會檢索Persion.java是否被編譯(是否存在Person.class),若不存在,則先編譯Person.java,java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器會自動的先編譯這個所依賴的類,然后引用。

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

2、編譯后的字節(jié)碼文件格式主要分為兩部分:常量池和方法字節(jié)碼。
常量池記錄的是代碼出現(xiàn)過的常量、類名、成員變量(Person.java中的類Person名、name成員變量)等以及符號引用(類引用、方法引用(OneTest.java中的person.say),成員變量引用等);方法字節(jié)碼中放的是各個方法的字節(jié)碼。

第二步

然后進行解釋運行階段,這里運行階段分為兩步:類的加載和類的執(zhí)行

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

1、OneTest類的加載:在類路徑下找到編譯好的 java 程序中;得到 OneTest.class 字節(jié)碼文件后,系統(tǒng)就會啟動一個 JVM 進程,JVM進程從classpath路徑下找到一個名為OneTest.class的二進制文件,將OneTest.class文件中的類信息加載到運行時數(shù)據(jù)區(qū)的方法區(qū)中,這一過程叫做類的加載。(只有類信息在方法區(qū)中,才能創(chuàng)建對象,使用類中的成員變量)關于類的加載器

2、運行OneTest.java中的main方法:main函數(shù)的第一條命令是Persion person = new Person();就是讓JVM創(chuàng)建一個Person對象,但是這時候方法區(qū)中沒有Person類的信息,所以JVM馬上加載Person類,把Person類的類型信息放到方法區(qū)中。

3、加載完Person類之后,Java虛擬機做的第一件事情就是在堆區(qū)中為一個新的Person實例分配內(nèi)存, 然后調(diào)用構造函數(shù)初始化Person實例,這個Person實例持有著指向方法區(qū)的Person類的類型信息(其中包含有方法表,java動態(tài)綁定的底層實現(xiàn))的引用

4、當使用person.say()的時候,JVM根據(jù)person引用找到Person對象,然后根據(jù)Person對象持有的引用定位到方法區(qū)中Person類的類型信息的方法表,獲得say()函數(shù)的字節(jié)碼的地址。

5、執(zhí)行say方法。

以上就是淺談Java文件被執(zhí)行的歷程的詳細內(nèi)容,更多關于Java文件被執(zhí)行的歷程的資料請關注腳本之家其它相關文章!

相關文章

  • Java應用注冊成Windows服務實現(xiàn)自啟的教程詳解

    Java應用注冊成Windows服務實現(xiàn)自啟的教程詳解

    這篇文章主要給大家介紹了Java應用注冊成Windows服務實現(xiàn)自啟的教程,文中有詳細的代碼示例和圖文講解供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2024-02-02
  • MyBatis使用級聯(lián)操作解決lombok構造方法識別失敗問題

    MyBatis使用級聯(lián)操作解決lombok構造方法識別失敗問題

    這篇文章主要介紹了MyBatis使用級聯(lián)操作解決lombok構造方法識別失敗問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java中sleep()與wait()的區(qū)別總結

    Java中sleep()與wait()的區(qū)別總結

    因為最近學習時正好碰到這兩個方法,就查閱相關資料,并通過程序?qū)崿F(xiàn),進行區(qū)別總結一下,所以下面這篇文章主要給大家總結介紹了關于Java中sleep()與wait()區(qū)別的相關資料,需要的朋友可以參考,下面來一起看看吧。
    2017-05-05
  • Idea中添加Maven項目支持scala的詳細步驟

    Idea中添加Maven項目支持scala的詳細步驟

    這篇文章主要介紹了Idea中添加Maven項目支持scala,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • springboot prototype設置多例不起作用的解決操作

    springboot prototype設置多例不起作用的解決操作

    這篇文章主要介紹了springboot prototype設置多例不起作用的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java中LinkedList和ArrayList的效率分析

    Java中LinkedList和ArrayList的效率分析

    本文主要介紹了Java中LinkedList和ArrayList的效率分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Java實現(xiàn)矩陣順時針旋轉(zhuǎn)90度的示例

    Java實現(xiàn)矩陣順時針旋轉(zhuǎn)90度的示例

    今天小編就為大家分享一篇Java實現(xiàn)矩陣順時針旋轉(zhuǎn)90度的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Java性能優(yōu)化之關于大對象復用的目標和注意點

    Java性能優(yōu)化之關于大對象復用的目標和注意點

    這篇文章主要介紹了Java性能優(yōu)化之關于大對象復用的目標和注意點,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • JAVA基于PDF box將PDF轉(zhuǎn)為圖片的實現(xiàn)方法

    JAVA基于PDF box將PDF轉(zhuǎn)為圖片的實現(xiàn)方法

    這篇文章主要介紹了JAVA基于PDF box將PDF轉(zhuǎn)為圖片的操作方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-07-07
  • java實現(xiàn)根據(jù)ip地址獲取地理位置

    java實現(xiàn)根據(jù)ip地址獲取地理位置

    本文給大家匯總介紹了2種分別使用新浪和淘寶接口,實現(xiàn)根據(jù)IP地址獲取詳細的地理位置的代碼,非常的實用,有需要的小伙伴可以參考下。
    2016-03-03

最新評論