首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JVM 核心機制深度解析:內存區域、垃圾回收、類加載、並發模型

     編輯:Java 綜合教學

JVM 核心機制深度解析:內存區域、垃圾回收、類加載、並發模型

Java 虛擬機 (JVM) 是 Java「一次編譯,到處運行」的基石。本文系統梳理 JVM 四大核心支柱:運行時數據區、垃圾回收、類加載機制、並發支持,並配合圖解與關鍵參數說明。

一、運行時數據區

JVM 將內存劃分為線程共享區與線程私有區:

JVM 內存結構

區域共享性核心職責
堆共享對象實例分配、GC 主戰場
方法區共享類信息、常量、靜態變量、即時編譯代碼
虛擬機棧私有方法調用棧幀(局部變量表、操作數棧、動態鏈接、返回地址)
本地方法棧私有Native 方法調用
程序計數器私有當前執行字節碼指令地址
直接內存共享NIO DirectBuffer、堆外內存

執行流程: 類加載→方法區 → main 線程創建→虛擬機棧/程序計數器 → new 對象→堆分配/棧存引用 → 執行引擎解釋/編譯運行

二、垃圾回收 (GC)

1. 對象存活判定

  • 引用計數法:簡單但無法解決循環引用(JVM 未採用)
  • 可達性分析法:從 GC Roots (棧局部變量、靜態屬性、常量、JNI 引用) 向下搜索,不可達即可回收

2. 回收算法

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

三、類加載機制

流程:加載 → 驗證 → 準備 → 解析 → 初始化

  1. 加載:查找二進制流,生成 java.lang.Class 實例
  2. 驗證:文件格式、元數據、字節碼、符號引用驗證
  3. 準備:靜態變量分配內存、賦默認值
  4. 解析:符號引用 → 直接引用
  5. 初始化:執行 <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)

JMM 結構

  • 主內存:共享變量
  • 工作內存:線程私有副本
  • 操作:read/load → use/assign → store/write

線程實現演進

  1. 內核線程 (1:1) —— 切換開銷大
  2. 用戶線程 (N:1) —— 靈活但一阻塞全阻塞
  3. 用戶線程 + 輕量級進程 (N:M) —— 綜合優勢 (現代 JVM 採用)

線程安全五級分類

  1. 不可變:final、String、基本類型包裝類
  2. 絕對線程安全:極少數 (如 CopyOnWriteArrayList)
  3. 相對線程安全:單操作安全,復合操作需外部同步 (如 Vector、HashTable)
  4. 線程兼容:非安全,可外部同步 (如 ArrayList、HashMap)
  5. 線程對立:無論是否同步都無法並發 (如 Thread.suspend/resume)

同步實現機制

  • 互斥同步:synchronized (重量級鎖 → JDK 1.6 優化:鎖粗化、鎖消除、偏向鎖、輕量級鎖、自適應自旋)
  • 非阻塞同步:CAS (Compare-And-Swap) + 自旋,樂觀鎖思想
  • 無同步方案:ThreadLocal、可重入代碼、不可變對象

核心參數: -Xms/Xmx 堆大小、-Xmn 新生代、-XX:SurvivorRatio、-XX:+UseG1GC、-XX:MaxMetaspaceSize 等

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
算法原理優點缺點
標記-清除標記存活,清除其餘實現簡單內存碎片多
標記-整理標記後向一端移動存活對象無碎片移動開銷大
復制內存劃二區,存活復制到另一區無碎片、分配快空間利用率 50%
分代收集新生代用復制,老年代用標記-整理/清除綜合最優實現複雜