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

JVM 體系結構詳解

 更新時間:2017年03月13日 10:01:51   作者:創(chuàng)心coder  
本文主要介紹了JVM體系結構的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧

JVM 是一種抽象的計算機,基于堆棧架構,它有自己的指令集和內存管理,是 Java 跨平臺的依據(jù),JVM解釋執(zhí)行字節(jié)碼,或將字節(jié)碼編譯成本地代碼執(zhí)行。Java 虛擬機體系結構如下:

Class File

Class File 是平臺無關的二進制文件,包含著能被JVM執(zhí)行的字節(jié)碼,其中多字節(jié)采用大端序,字符使用一種改進的UTF-8編碼。Class文件精確的描述了一個類或接口的信息,其中包括:

  • 常量池:數(shù)值和字符串字面常量,元數(shù)據(jù)如類名、方法名稱、參數(shù),以及各種符號引用
  • 方法的字節(jié)碼指令,參數(shù)個數(shù),局部變量,最大操作數(shù)棧深度,異常等信息

Class Loader

類加載器,JVM在類首次使用時動態(tài)的加載、鏈接和初始化。JVM默認的加載模型是雙親委派模型,類加載器之間存在父子關系的層次結構,內部使用組合實現(xiàn)。此外還有其他的加載方式,比如Servlet加載,它先嘗試自己加載,不成功再委派上層加載器,類隔離;OSGI加載器之間是一種網(wǎng)狀的依賴關系,沒有上下層的區(qū)分,比較靈活。

加載

加載就是將Class文件表示的類或接口,在JVM方法區(qū)中創(chuàng)建一個與之對應的java.lang.Class對象,像Class.forName()、ClassLoader.loadClass()、反射都能觸發(fā)類加載。當觸發(fā)一個類加載時,詳細的過程如下:

  • 檢查類是否已經(jīng)被加載
  • 將加載請求委派給上層類加載器
  • 自己嘗試搜索類并加載

當ClassLoader在classpath中未找到類文件,會拋出ClassNotFoundException;當類A引用類B,類A已經(jīng)成功加載,但是加載B時未找到類文件,會拋出NoClassDefFoundError。JVM有以下幾種類加載器:

  • Bootstrap ClassLoader,啟動類加載器,加載 <java_home>\jre\lib 中 Java 核心類庫
  • Extension ClassLoader,擴展類加載器,加載 <java_home>\jre\lib\ext 中的類
  • System ClassLoader,系統(tǒng)類加載器,也叫應用程序類加載器(Application class loader),加載 CLASSPATH 環(huán)境變量中的類

鏈接

  • 驗證:確保class文件的正確性。
  • 準備:為類靜態(tài)字段分配內存并初始化為默認值,不會執(zhí)行任何字節(jié)碼指令。
  • 解析:將符號引用轉為方法區(qū)(運行時常量池)直接引用

初始化

執(zhí)行類初始化方法,即賦值靜態(tài)字段,執(zhí)行靜態(tài)塊,順序按照其定義的先后。父類的靜態(tài)域會先于子類靜態(tài)域初始化。

至此,一個類或接口被加載到了內存中,JVM會保證整個過程是線程安全的。需要注意的是整個過程沒有涉及到任何實例對象。

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

1. Method Area:線程共享,存儲運行時常量池、類字段和方法信息、靜態(tài)變量和方法的字節(jié)碼,是堆的邏輯組成部分,這部分的垃圾回收是可選的。值得一提的是Hotspot JVM自JDK8之后,調整了這部分內存的內容,class meta-data的分配使用本地內存,interned String和類靜態(tài)變量移動到了Java堆。

2. 運行時常量池:對于JVM來說具有核心作用,基本上涉及到方法或字段,JVM就會在運行時常量池中搜索其具體的內存地址。

3. Heap:線程共享,存儲實例對象,實例變量以及數(shù)組,是垃圾回收的主要區(qū)域。

4. JVM Stack:線程私有,用于存儲棧幀,當方法被調用時會創(chuàng)建一個棧幀入棧,棧幀由以下幾部分組成:

  • 局部變量表:從0開始存儲this、方法參數(shù)、局部變量。
  • 操作數(shù)棧:方法的工作區(qū),在操作數(shù)棧和局部變量之間交換數(shù)據(jù),存儲中間結果,操作數(shù)棧深度在編譯時就能確定。
  • 幀數(shù)據(jù):方法返回值,異常分派,以及當前方法所在類運行時常量池的引用。

5. PC Register:線程私有,保存當前指令地址,執(zhí)行后指向下一條指令地址。

6. Native Method Stack:線程私有,存儲本地方法信息,C或C++棧。

執(zhí)行引擎

讀取、翻譯、執(zhí)行字節(jié)碼。JVM基于棧架構,這個棧就是操作數(shù)棧,字節(jié)碼指令就是通過它進行各種運算。此外還有基于寄存器的虛擬機。

  • Interpreter,翻譯:解釋字節(jié)碼比較快,執(zhí)行慢,缺點是每次方法調用都要重新翻譯解釋一遍。
  • JIT Compiler,即時編譯:找出程序中頻繁調用的熱點方法,將字節(jié)碼編譯成本地代碼,提高性能。
  • Garbage Collector,垃圾收集器:回收無效對象,判斷對象是否可回收,可采用不同的垃圾回收算法。

本地方法接口和庫

JNI,調用本地方法,c/c++庫;執(zhí)行引擎所需的本地方法庫。

小結

主流JVM的實現(xiàn)有Oracle的Hotspot JVM、JRockit以及IBM的JVM。說到JVM調優(yōu),默認指的就是Hotspot VM,足見其流行程度。如今搞Java不去了解JVM就顯得有點low了-v-。

要想寫出高質量代碼,不僅要了解JVM,像調優(yōu),問題排查等都需要完備的計算機基礎知識,其實無論用什么語言開發(fā),都是一個構建和完善自身計算機知識體系的過程。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • Java實現(xiàn)雙向鏈表(兩個版本)

    Java實現(xiàn)雙向鏈表(兩個版本)

    這篇文章主要介紹了Java實現(xiàn)雙向鏈表(兩個版本)的相關資料,需要的朋友可以參考下
    2016-02-02
  • Java動態(tài)顯示當前日期和時間

    Java動態(tài)顯示當前日期和時間

    這篇文章主要為大家詳細介紹了Java動態(tài)顯示當前日期和時間,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • mybatis@insert?注解如何判斷insert或是update

    mybatis@insert?注解如何判斷insert或是update

    這篇文章主要介紹了mybatis@insert?注解如何判斷insert或是update,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 解決springboot報錯找不到自動注入的service問題

    解決springboot報錯找不到自動注入的service問題

    這篇文章主要介紹了解決springboot報錯找不到自動注入的service問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java之next()、nextLine()區(qū)別及問題解決

    Java之next()、nextLine()區(qū)別及問題解決

    這篇文章主要介紹了Java之next()、nextLine()區(qū)別及問題解決,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • JAVA實現(xiàn)多線程的兩種方法實例分享

    JAVA實現(xiàn)多線程的兩種方法實例分享

    這篇文章介紹了JAVA實現(xiàn)多線程的兩種方法實例分享,有需要的朋友可以參考一下
    2013-08-08
  • Mybatis一對多和多對一處理的深入講解

    Mybatis一對多和多對一處理的深入講解

    Mybatis可以通過關聯(lián)查詢實現(xiàn),關聯(lián)查詢是幾個表聯(lián)合查詢,只查詢一次,通過在resultMap里面的association,collection節(jié)點配置一對一,一對多的類就可以完成,這篇文章主要給大家介紹了關于Mybatis一對多和多對一處理的相關資料,需要的朋友可以參考下
    2021-09-09
  • spring boot實戰(zhàn)之內嵌容器tomcat配置

    spring boot實戰(zhàn)之內嵌容器tomcat配置

    本篇文章主要介紹了Spring Boot 使用內嵌的tomcat容器配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot中OKHttp和壓縮文件的使用實戰(zhàn)教程

    SpringBoot中OKHttp和壓縮文件的使用實戰(zhàn)教程

    本文介紹了如何在SpringBoot中使用OKHttp發(fā)起請求和處理壓縮文件,包括文件的存儲配置、實體類、配置類和初始化類的設置,以及如何通過主程序和測試類進行實際操作,最后提供了必要的依賴添加方法,以確保功能的實現(xiàn)
    2024-10-10
  • java使用鏈表來模擬棧的入棧出棧操作實例代碼

    java使用鏈表來模擬棧的入棧出棧操作實例代碼

    這篇文章主要介紹了java 使用鏈表來模擬棧的入棧出棧操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論

江陵县| 平山县| 朝阳县| 湘潭县| 湘潭县| 新疆| 临桂县| 岱山县| 商洛市| 多伦县| 新余市| 郴州市| 衡山县| 永城市| 海兴县| 花莲市| 许昌县| 岳阳县| 阜南县| 济南市| 文安县| 宁强县| 都江堰市| 班玛县| 洪雅县| 新野县| 扎兰屯市| 延吉市| 陇川县| 本溪市| 和平县| 潞城市| 垫江县| 和静县| 平湖市| 嵩明县| 文水县| 福贡县| 都兰县| 新绛县| 进贤县|