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

JVM有哪些組成部分示例詳解(面試必問的Java運行時架構)

 更新時間:2026年05月12日 08:20:16   作者:Resky0818  
JVM是Java應用程序運行的核心環(huán)境,因此在Java相關的面試中,JVM相關的知識是經(jīng)常被考察的重點,下面這篇文章主要介紹了JVM有哪些組成部分,文中通過代碼介紹介紹的非常詳細,需要的朋友可以參考下

前言

我剛學 Java 的時候,以為 JVM 就是個"黑盒",代碼寫完往里一扔就能跑。

后來才知道,JVM 里面學問大了去了。

今天這篇文章,就是我復習 JVM 時整理的筆記。面試問到 JVM 結構,如果你只能說出"堆和棧",那大概率要被追問到懷疑人生。

一、先畫個整體框架

在說每個組件之前,先把 JVM 的結構捋清楚。

記住這個圖,這是整個 JVM 的骨架。

三個核心模塊:

  1. 類加載器(ClassLoader)—— 把 class 文件加載進來

  2. 運行時數(shù)據(jù)區(qū)(Runtime Data Area)—— 分配內存,存數(shù)據(jù)

  3. 執(zhí)行引擎(Execution Engine)—— 執(zhí)行字節(jié)碼指令

二、類加載器 ClassLoader

它干什么的?

ClassLoader 負責把 .class 文件(字節(jié)碼)加載到內存中,轉換成 JVM 能認識的數(shù)據(jù)結構。

加載流程:

.java 源文件
    ↓ 編譯
.class 字節(jié)碼文件
    ↓ ClassLoader
內存中的 Class 對象(java.lang.Class)

三個階段

1. 加載(Loading)

  • 通過類的全限定名找到 class 文件

  • 把字節(jié)流轉換成方法區(qū)的數(shù)據(jù)結構

  • 在堆里生成一個 Class 對象,作為訪問入口

2. 鏈接(Linking)

  • 驗證:檢查字節(jié)碼格式是否正確(安全檢查)

  • 準備:給靜態(tài)變量分配內存,設置默認值

  • 解析:把符號引用替換成直接引用(比如把"方法名"變成內存地址)

3. 初始化(Initialization)

  • 執(zhí)行靜態(tài)代碼塊和靜態(tài)變量的賦值

  • 這是真正執(zhí)行代碼的地方

雙親委派模型

這塊是面試高頻追問。

三層類加載器:

加載器負責加載例子
Bootstrap ClassLoaderJDK 核心類String, Object
Extension ClassLoaderJDK 擴展類javax.*
Application ClassLoader用戶 classpath自己寫的類

雙親委派流程:

加載請求
   ↓
ApplicationClassLoader
   ↓ 問爸
ExtensionClassLoader
   ↓ 問爸
BootstrapClassLoader
   ↓ 找不到
ExtensionClassLoader 嘗試加載
   ↓ 找不到
ApplicationClassLoader 嘗試加載
   ↓ 成功
返回 Class

為什么這樣設計?

我當初也被問懵了,后來想明白了一個例子:

如果你自己寫一個 java.lang.String,沒有雙親委派的話,JVM 就會加載你自己寫的 String,安全性全沒了。

雙親委派保證:核心類庫優(yōu)先被 Bootstrap 加載,防止用戶代碼覆蓋 JDK。

三、運行時數(shù)據(jù)區(qū) Runtime Data Area

這是 JVM 里最重要的部分,也是面試追問的重災區(qū)。

1. 程序計數(shù)器(Program Counter Register)

特點:

  • 很小,只存一個指針

  • 指向下一條要執(zhí)行的字節(jié)碼指令

  • 線程私有:每個線程都有自己的 PC

為什么不會 OOM?

因為它只存一個指令地址,大小固定,不會動態(tài)增長。

唯一沒有 GC 的區(qū)域。

2. 虛擬機棧(VM Stack)

特點:

  • 線程私有

  • 存儲方法調用的數(shù)據(jù)

  • 每個方法叫一個棧幀(Stack Frame)

一個棧幀包含:

  • 局部變量表(方法參數(shù) + 局部變量)

  • 操作數(shù)棧(計算時的臨時空間)

  • 動態(tài)鏈接(指向常量池的引用)

  • 返回地址

會 OOM 嗎?

會。如果遞歸沒寫好,棧深度超過限制,就會 StackOverflowError。

我之前寫遞歸算法就踩過這個坑:

// 死遞歸,棧溢出
public int sum(int n) {
 ? ?return sum(n) + 1; ?// 沒有終止條件
}

3. 本地方法棧(Native Method Stack)

和虛擬機棧一樣,只不過服務的是本地方法(native keyword 修飾的方法)。

JNI 調用(C/C++ 寫的代碼)會用到這里。

4. 堆(Heap)

JVM 里最大的內存區(qū)域。

  • 存儲對象實例和數(shù)組

  • 線程共享:所有線程都能訪問

  • GC 的主要戰(zhàn)場

為什么要分代?

因為對象的生命周期不同:

  • 新生代:剛創(chuàng)建的對象(朝生夕死)

  • 老年代:存活時間長的對象

  • 分代后,GC 更有針對性,效率更高

5. 方法區(qū)(Method Area)

存儲:

  • 類的元信息(類名、修飾符、父類)

  • 類的結構(字段、方法)

  • 運行時常量池(字面量和符號引用)

  • JIT 編譯后的代碼緩存

JDK 1.8 的變化:

之前方法區(qū)在堆里,叫 Permanent Generation(永久代)。

JDK 1.8 改成了 Metaspace,放在本地內存里。

版本方法區(qū)實現(xiàn)位置
JDK 1.7PermGen堆內
JDK 1.8Metaspace本地內存

為什么要改?

因為 PermGen 容易 OOM。你要是項目中依賴了一堆 jar 包,PermGen 分分鐘爆掉。

四、執(zhí)行引擎 Execution Engine

它干什么的?

把字節(jié)碼翻譯成機器碼,讓 CPU 執(zhí)行。

解釋器 vs JIT 編譯器

組件特點適用場景
解釋器逐行翻譯,立即執(zhí)行啟動階段,一次性執(zhí)行
JIT 編譯器編譯成機器碼,緩存起來熱點代碼,多次執(zhí)行

JIT 的熱點探測:

JVM 會監(jiān)控方法的執(zhí)行頻率,熱點代碼會被 JIT 編譯成機器碼。

兩個計數(shù)器:

  • 方法調用計數(shù)器

  • 回邊計數(shù)器(循環(huán)體)

超過閾值就觸發(fā)編譯。

垃圾回收器

GC 是 JVM 里最復雜也最常問的部分。

常見 GC 算法:

算法原理缺點
標記-清除標記存活對象,清理未標記的產(chǎn)生內存碎片
復制把活對象復制到另一半空間浪費一半內存
標記-整理標記后整理內存整理耗時

常見垃圾回收器:

  • Serial(單線程)

  • Parallel(多線程,吞吐量優(yōu)先)

  • CMS(并發(fā)標記清除,低停頓)

  • G1(REGION劃分,可預測停頓)

  • ZGC / Shenandoah(超低停頓,JDK 11+)

五、本地接口 JNI

Java 不是萬能的,有些場景需要調用本地代碼(C/C++)。

JNI 就是 Java 和 native 代碼之間的橋梁。

典型場景:

  • 調用操作系統(tǒng) API

  • 追求極致性能(數(shù)學計算)

  • 訪問硬件

public native String hello(); ?// native 方法,調用 C 實現(xiàn)

六、記憶口訣

JVM 三大部分:
┌─────────────────────────────────┐
│  類加載器 ──── 加載字節(jié)碼       │
│  運行時數(shù)據(jù)區(qū) ── 分配內存       │
│  執(zhí)行引擎 ──── 執(zhí)行字節(jié)碼       │
└─────────────────────────────────┘
?
運行時數(shù)據(jù)區(qū)五塊:
計數(shù)器(無GC)
虛擬機棧(存方法調用,會OOM)
本地方法棧(native方法)
堆(對象,會GC)
方法區(qū)(類信息)
?
雙親委派:
Bootstrap → Extension → Application

寫在最后

JVM 這塊知識,面試基本必問。

我踩過的坑是:只背概念,不畫圖。

后來我把 JVM 的結構畫了 5 遍,把每個區(qū)域的作用、特點、常見問題都寫上,面試時直接畫給面試官看。

面試官當時眼睛一亮,說:"這個理解方式不錯。"

技術表達很重要。能畫出來、講清楚,比背出來強 100 倍。

到此這篇關于JVM有哪些組成部分的文章就介紹到這了,更多相關JVM組成部分內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在macOS上安裝jenv管理JDK版本的詳細步驟

    在macOS上安裝jenv管理JDK版本的詳細步驟

    jEnv是一個命令行工具,正如它的官網(wǎng)所宣稱的那樣,它是來讓你忘記怎么配置JAVA_HOME環(huán)境變量的神隊友,這篇文章主要介紹了在macOS上安裝jenv管理JDK版本的詳細步驟,需要的朋友可以參考下
    2025-07-07
  • java實現(xiàn)的AES加密算法完整實例

    java實現(xiàn)的AES加密算法完整實例

    這篇文章主要介紹了java實現(xiàn)的AES加密算法,結合完整實例形式分析了AES加密類的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Windows系統(tǒng)編寫bat腳本啟動、停止及重啟Java服務jar包

    Windows系統(tǒng)編寫bat腳本啟動、停止及重啟Java服務jar包

    在bat文件中我們將編寫一些代碼來運行Java jar文件,下面這篇文章主要給大家介紹了關于Windows系統(tǒng)編寫bat腳本啟動、停止及重啟Java服務jar包的相關資料,需要的朋友可以參考下
    2023-12-12
  • Component-Scan 不掃描jar里面的類問題

    Component-Scan 不掃描jar里面的類問題

    這篇文章主要介紹了Component-Scan 不掃描jar里面的類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java list去重操作實現(xiàn)方式

    java list去重操作實現(xiàn)方式

    Java中的List是可以包含重復元素的(hash code 和equals),接下來將介紹兩種方式實現(xiàn)java list去重操作,感興趣的朋友可以參考下
    2012-12-12
  • Java中使用HttpGet發(fā)起HTTP請求的適用場景詳解

    Java中使用HttpGet發(fā)起HTTP請求的適用場景詳解

    HttpGet是HTTP協(xié)議中用于獲取服務器資源的GET請求實現(xiàn),屬于Java的HttpClient庫核心類之一,本文圍繞HttpGet的基本使用展開,詳細介紹了HTTP請求的結構、HttpGet的創(chuàng)建與配置、請求執(zhí)行流程、響應處理方式,以及資源釋放和異常處理的關鍵步驟,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • ElasticSearch學習之多條件組合查詢驗證及示例分析

    ElasticSearch學習之多條件組合查詢驗證及示例分析

    這篇文章主要為大家介紹了ElasticSearch 多條件組合查詢驗證及示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • SpringBoot中的靜態(tài)資源訪問的實現(xiàn)

    SpringBoot中的靜態(tài)資源訪問的實現(xiàn)

    這篇文章主要介紹了SpringBoot中的靜態(tài)資源訪問的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 關于Spring Bean實例過程中使用反射和遞歸處理的Bean屬性填充問題

    關于Spring Bean實例過程中使用反射和遞歸處理的Bean屬性填充問題

    本文帶領大家一起學習下在Spring Bean實例過程中如何使用反射和遞歸處理的Bean屬性填充,需要在類 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加補全屬性方法,具體操作方法跟隨小編一起學習下吧
    2021-06-06
  • 梳理總結Java?static關鍵字的方法作用

    梳理總結Java?static關鍵字的方法作用

    這篇文章主要介紹了梳理總結Java?static關鍵字的方法作用,?static?關鍵字可以用來修飾的成員變量和成員方法,被修飾的成員是屬于類的,而不是單單是屬于某個對象的
    2022-06-06

最新評論

巴彦县| 柘城县| 孝昌县| 太康县| 许昌市| 灵寿县| 肇源县| 张家界市| 桂林市| 江孜县| 普兰县| 剑川县| 武山县| 大姚县| 阳江市| 庆云县| 阿荣旗| 林芝县| 鸡西市| 射洪县| 应用必备| 喀什市| 天峨县| 民乐县| 大兴区| 滁州市| 雷波县| 渭南市| 红河县| 拉萨市| 绥江县| 潞西市| 阳西县| 衡东县| 汝州市| 五河县| 连平县| 灵川县| 芜湖市| 维西| 渝中区|