JVM 核心機制深度解析:內存區域、垃圾回收、類加載、並發模型
Java 虛擬機 (JVM) 是 Java「一次編譯,到處運行」的基石。本文系統梳理 JVM 四大核心支柱:運行時數據區、垃圾回收、類加載機制、並發支持,並配合圖解與關鍵參數說明。
一、運行時數據區
JVM 將內存劃分為線程共享區與線程私有區:

| 區域 | 共享性 | 核心職責 |
| 堆 | 共享 | 對象實例分配、GC 主戰場 |
| 方法區 | 共享 | 類信息、常量、靜態變量、即時編譯代碼 |
| 虛擬機棧 | 私有 | 方法調用棧幀(局部變量表、操作數棧、動態鏈接、返回地址) |
| 本地方法棧 | 私有 | Native 方法調用 |
| 程序計數器 | 私有 | 當前執行字節碼指令地址 |
| 直接內存 | 共享 | NIO DirectBuffer、堆外內存 |
執行流程: 類加載→方法區 → main 線程創建→虛擬機棧/程序計數器 → new 對象→堆分配/棧存引用 → 執行引擎解釋/編譯運行
二、垃圾回收 (GC)
1. 對象存活判定
- 引用計數法:簡單但無法解決循環引用(JVM 未採用)
- 可達性分析法:從 GC Roots (棧局部變量、靜態屬性、常量、JNI 引用) 向下搜索,不可達即可回收
2. 回收算法
| 算法 | 原理 | 優點 | 缺點 |
| 標記-清除 | 標記存活,清除其餘 | 實現簡單 | 內存碎片多 |
| 標記-整理 | 標記後向一端移動存活對象 | 無碎片 | 移動開銷大 |
| 復制 | 內存劃二區,存活復制到另一區 | 無碎片、分配快 | 空間利用率 50% |
| 分代收集 | 新生代用復制,老年代用標記-整理/清除 | 綜合最優 | 實現複雜 |
3. 分代與收集器
- 新生代:Eden + Survivor (8:1),Minor GC 頻繁、快
- 老年代:Major/Full GC 觸發條件複雜,耗時長
- 常用收集器:Serial, ParNew, Parallel Scavenge, CMS, G1, ZGC
4. GC 觸發時機
- Eden 空間不足 → Minor GC
System.gc() 僅建議,不保證執行
- 老年代空間不足 / 永久代不足 / 显式調用 → Full GC
三、類加載機制
流程:加載 → 驗證 → 準備 → 解析 → 初始化
- 加載:查找二進制流,生成
java.lang.Class 實例
- 驗證:文件格式、元數據、字節碼、符號引用驗證
- 準備:靜態變量分配內存、賦默認值
- 解析:符號引用 → 直接引用
- 初始化:執行
<clinit>(),賦正確初始值
雙親委派模型

- Bootstrap ClassLoader (C++):加載
<JAVA_HOME>/lib (rt.jar 等)
- Extension ClassLoader:加載
<JAVA_HOME>/lib/ext
- Application ClassLoader:加載 Classpath,
getSystemClassLoader() 獲取
委派規則:子加載器收到請求先委派父加載器,父無法加載時子才嘗試。優勢:保護核心類庫不被篡改(如用戶自定義 java.lang.Object 不會被加載)。
自定義類加載器場景
- 加密 Class 文件傳輸,加載前解密
- 字節碼增強 (cglib/ASM) 修改後重新加載
- OSGi 模塊隔離,每模塊獨立 ClassLoader
四、並發模型與線程安全
Java 內存模型 (JMM)

- 主內存:共享變量
- 工作內存:線程私有副本
- 操作:read/load → use/assign → store/write
線程實現演進
- 內核線程 (1:1) —— 切換開銷大
- 用戶線程 (N:1) —— 靈活但一阻塞全阻塞
- 用戶線程 + 輕量級進程 (N:M) —— 綜合優勢 (現代 JVM 採用)
線程安全五級分類
- 不可變:
final、String、基本類型包裝類
- 絕對線程安全:極少數 (如
CopyOnWriteArrayList)
- 相對線程安全:單操作安全,復合操作需外部同步 (如
Vector、HashTable)
- 線程兼容:非安全,可外部同步 (如
ArrayList、HashMap)
- 線程對立:無論是否同步都無法並發 (如
Thread.suspend/resume)
同步實現機制
- 互斥同步:
synchronized (重量級鎖 → JDK 1.6 優化:鎖粗化、鎖消除、偏向鎖、輕量級鎖、自適應自旋)
- 非阻塞同步:CAS (Compare-And-Swap) + 自旋,樂觀鎖思想
- 無同步方案:ThreadLocal、可重入代碼、不可變對象
核心參數: -Xms/Xmx 堆大小、-Xmn 新生代、-XX:SurvivorRatio、-XX:+UseG1GC、-XX:MaxMetaspaceSize 等
- 上一篇文章: SpringMVC 整合 Bean Validation 1.1 (Hibernate Validator) 完整指南
- 下一篇文章: 100天Java學習計劃 Day 03:深入淺出Java方法
Copyright ©
程式碼之家 All Rights Reserved