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

JVM類運行機制實現(xiàn)原理解析

 更新時間:2020年12月08日 15:51:03   作者:zi萱  
這篇文章主要介紹了JVM類運行機制實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下

1.一段java程序是如何運行起來的呢?

Java源文件,通過編譯器,產(chǎn)生.Class字節(jié)碼文件,字節(jié)碼文件通過Java虛擬機中的解釋器,編譯成特定及其上的機器碼,那Java虛擬機又是怎樣加載java程序并執(zhí)行起來的呢?

簡單來說:通過類加載器加載字節(jié)碼文件,被分配到JVM的運行時數(shù)據(jù)區(qū)的字節(jié)碼會被執(zhí)行引擎執(zhí)行。

(1)類加載器,加載.class文件

(2)運行數(shù)據(jù)區(qū):棧區(qū)、堆區(qū)、PC寄存器、本地方法棧、方法區(qū)

(3)執(zhí)行引擎:執(zhí)行包在裝載類方法中的指令

2. 類加載器

類的加載是指將類的.class文件讀入內(nèi)存,將其放在方法區(qū)內(nèi),然后在堆區(qū)創(chuàng)建一個java.lang.Class對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu),并向java程序員提供訪問方法區(qū)內(nèi)數(shù)據(jù)結(jié)構(gòu)的接口。類加載器并不需要等到某個類被首次主動使用時再加載它,JVM允許類加載器在預(yù)料某個類將要被使用時就預(yù)先加載它。

類的生命周期

類加載過程包括:加載、驗證、準備、解析、初始化

(1)加載:查找并加載類的二進制數(shù)據(jù)。

a. 通過一個類的全限定名來獲取其定義的二進制字節(jié)流

b. 將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)

c. 在Java堆中生成一個代表這個類的java.lang.Class,作為對方法區(qū)中這些數(shù)據(jù)的訪問入口

(2)連接:

a. 驗證:確保被加載類的正確性

b. 準備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認值

c. 解析:把類中的符號引用轉(zhuǎn)換為直接引用

(3)初始化:為類的靜態(tài)變量賦予正確的初始值

類加載器

  

啟動類加載器:BootstrapClassLoader,負責加載存放在JDK\jre\lib或被-Xbootclasspath參數(shù)指定的路徑中的,并且能被虛擬機識別的類庫。

擴展類加載器:ExtensionClassLoader,負責加載DK\jre\lib\ext目錄中,或者由java.ext.dirs系統(tǒng)變量指定的路徑中的所有類庫。

引用程序類加載器:ApplicationClassLoader,負責加載用戶路徑ClassPath所指定的類

JVM類加載機制

全盤負責:當一個類加載器負責加載某個Class時,該Class所依賴的和引用的其他Class也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入

父類委托:先讓父類加載器駛?cè)爰虞d該類,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類

緩存機制:保證所有加載過的類都會被緩存,當需要使用某個類時,先從緩存區(qū)尋找該Class,只有緩存區(qū)不存在該類時,才會去加載此類。

雙親委派機制

意義:系統(tǒng)類防止內(nèi)存出出現(xiàn)多分同樣的字節(jié)碼;保證Java程序安全穩(wěn)定運行

(1)當AppClassLoader去加載一個class時,它首先不會自己去加載這個類,而是把類加載請求委派給父類加載器ExtClassLoader去完成。

(2)當ExtClassLoader去加載一個class時,它首先也不會自己去加載這個類,而是把類加載請求委派給BootStrapClassLoader去完成。

(3)如果BootStrapClassLoader加載失敗,會使用ExtClassLoader來嘗試加載。

(4)如果ExtClassLoader加載失敗,會使用AppClassLoader來加載

(5)如果AppClassLoader也加載失敗,則會爆出異常ClassNotFoundException

3. 運行數(shù)據(jù)區(qū)

(1)虛擬機棧:每個線程有一個私有的棧,隨著線程的創(chuàng)建而創(chuàng)建。棧里面存著一種叫“棧幀”的東東,每個方法會創(chuàng)建一個棧幀,棧幀中存放局部變量表(基本數(shù)據(jù)類型和對象飲用)、操作數(shù)棧、方法出口等信息,棧的大小可以固定也可以擴展,當棧調(diào)用深度大于JVM所允許的范圍,會拋出StackOverFlowError。

(2)本地方法棧:主要與虛擬機用到的native方法相關(guān),java程序員不太關(guān)心。

(3)PC寄存器:也叫程序計數(shù)器。JVM支持多線程運行,每個線程都有自己的程序計數(shù)器。若當前執(zhí)行的是JVM的方法,則該寄存器中保存當前執(zhí)行指令的地址,若執(zhí)行native方法,則為空。

(4)堆:堆內(nèi)存是JVM所有線程共享的部分,虛擬機啟動時就已經(jīng)創(chuàng)建。所有對象和數(shù)組都在堆上進行分配。這部分空間可通過GC進行回收,當申請不到空間時會拋出OutOfMemoryError。

(5)方法區(qū):所有線程共享。主要用于存儲類的信息,常量池,方法數(shù)據(jù),方法代碼等。

4. 執(zhí)行引擎

方法調(diào)用會導(dǎo)致棧幀的入棧,會確定調(diào)用哪一個方法。

(1)棧幀。程序的執(zhí)行對應(yīng)著棧幀的入棧和出棧,棧幀主要包括:局部變量表、操作數(shù)棧、動態(tài)連接、方法返回地址等。

(2)方法調(diào)用。

解析調(diào)用:類加載的解析階段,會將其中一部分符號引用轉(zhuǎn)化為直接引用,這種解析的前提是方法在程序真正運行之前就有一個可確定的調(diào)用版本。編譯期可確定調(diào)用方法的版本:靜態(tài)方法、私有方法、實例構(gòu)造器、父類方法。
分派調(diào)用:

a. 靜態(tài)分派:發(fā)生在編譯階段。所有依賴于靜態(tài)類型來定位方法執(zhí)行版本的分派動作成為靜態(tài)分派,典型方法是重載。javac編譯器根據(jù)參數(shù)的靜態(tài)類型決定使用哪個重載版本。

b. 動態(tài)分派:運行期根據(jù)實際類型確定方法執(zhí)行版本。與方法重寫有密切關(guān)系。

c. 單分派和多分派:單分派是根據(jù)一個宗量對目標方法進行選擇,多分派是根據(jù)多于一個宗量對目標方法進行選擇。

(3)執(zhí)行引擎需將字節(jié)碼轉(zhuǎn)換成可以直接被JVM執(zhí)行的語言,可通過以下兩種方式轉(zhuǎn)換:

a. 解釋器:一條一條的讀取,解釋并且執(zhí)行字節(jié)碼指令

b. 即時編譯器:執(zhí)行引擎首先按照解釋執(zhí)行的方式來執(zhí)行,在合適的時候,即時編譯器把整段字節(jié)碼編譯成本地代碼。內(nèi)置了JIT編譯器的JVM都會檢查方法的執(zhí)行頻率,如果一個方法的執(zhí)行頻率超過一個特定的值的話,那么這個方法就會被編譯成本地代碼。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java如何計算兩個時間段內(nèi)的工作日天數(shù)

    Java如何計算兩個時間段內(nèi)的工作日天數(shù)

    這篇文章主要介紹了Java如何計算兩個時間段內(nèi)的工作日天數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java 中函數(shù) Function 的使用和定義示例小結(jié)

    Java 中函數(shù) Function 的使用和定義示例小結(jié)

    這篇文章主要介紹了Java 中函數(shù) Function 的使用和定義小結(jié),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?

    Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?

    這篇文章主要介紹了Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue結(jié)合Springboot實現(xiàn)用戶列表單頁面(前后端分離)

    Vue結(jié)合Springboot實現(xiàn)用戶列表單頁面(前后端分離)

    本文主要介紹了Vue結(jié)合Springboot實現(xiàn)用戶列表單頁面,可以實現(xiàn)簡單的查詢,刪除,修改,和添加用戶信息功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java堆棧跟蹤工具jstack的使用教程

    java堆棧跟蹤工具jstack的使用教程

    jstack(stack?trace?for?java)是java虛擬機自帶的一種堆棧跟蹤工具,主要用于生成java虛擬機當前時刻的線程快照,下面我們就來學(xué)習一下它的具體使用吧
    2023-11-11
  • Spring使用xml方式整合第三方框架流程詳解

    Spring使用xml方式整合第三方框架流程詳解

    這篇文章主要介紹了Spring使用xml方式整合第三方框架流程,Spring會在應(yīng)用上下文中為某個bean尋找其依賴的bean,Spring中bean有三種裝配機制,分別是:在xml中顯式配置、在java中顯式配置、隱式的bean發(fā)現(xiàn)機制和自動裝配
    2023-02-02
  • Java編程Nashorn實例代碼

    Java編程Nashorn實例代碼

    這篇文章主要介紹了Java編程Nashorn實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java 異常詳解

    Java 異常詳解

    本文主要介紹了異常與錯誤的區(qū)別,異常的體現(xiàn)分類,異常的處理機制,如何自定義異常等,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Scala文件操作示例代碼講解

    Scala文件操作示例代碼講解

    本文章向大家介紹Scala 學(xué)習筆記之文件操作,主要內(nèi)容包括其使用實例、應(yīng)用技巧、基本知識點總結(jié)和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下
    2023-04-04
  • SpringBoot生成jar/war包的布局應(yīng)用

    SpringBoot生成jar/war包的布局應(yīng)用

    在 Spring Boot 中,"布局應(yīng)用"(Application Layout)指的是打包生成的可執(zhí)行 jar 或 war 文件中的內(nèi)容組織結(jié)構(gòu),本文給大家介紹了SpringBoot生成jar/war包的布局應(yīng)用,需要的朋友可以參考下
    2024-02-02

最新評論

镇安县| 儋州市| 贺州市| 吐鲁番市| 大宁县| 旅游| 伽师县| 冕宁县| 潜江市| 临潭县| 阳东县| 卫辉市| 盱眙县| 于都县| 兰西县| 巴马| 灌阳县| 连云港市| 承德县| 南丹县| 阿鲁科尔沁旗| 柳江县| 桦南县| 弥勒县| 福泉市| 木兰县| 江油市| 阿鲁科尔沁旗| 南木林县| 吴江市| 陇南市| 丹阳市| 陆川县| 麻阳| 济宁市| 芷江| 泰兴市| 衡山县| 托克逊县| 镇赉县| 潮安县|