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

JVM 深度解析:架構、類載入與執行引擎核心原理

     編輯:Java 程式設計入門

Java 虛擬機(JVM)是 Java 跨平台的基石,理解其內部運作機制對排查記憶體洩漏、效能調優、解決類衝突至關重要。本文從規範定義、生命週期、體系架構三個維度,系統梳理 JVM 核心知識體系。

JVM 的三重含義

「Java 虛擬機」根據語境指代不同東西:

  1. 抽象規範:The Java Virtual Machine Specification 定義的指令集、類檔案格式、執行時資料區等標準
  2. 具體實現:HotSpot、OpenJ9、GraalVM 等符合規範的產品
  3. 執行時實例:啟動 java -jar app.jar 時建立的進程實體

生命週期:從 main() 到進程退出

啟動階段

JVM 實例誕生於啟動類的 public static void main(String[]) 執行前。類載入器先載入啟動類,驗證、準備、解析、初始化(<clinit>),最後執行 main 方法。啟動類名由啟動參數或 JAR 清單指定。

執行緒模型與退出條件

JVM 內部區分兩類執行緒:

  • 守護執行緒:GC、JIT 編譯等 JVM 內部服務執行緒;使用者程式可透過 thread.setDaemon(true) 標記
  • 使用者執行緒:main 執行緒及其衍生的非守護執行緒

JVM 退出規則:只要存在任一使用者執行緒存活,JVM 就不會退出。所有使用者執行緒結束(正常返回或未捕獲異常終止)時,JVM 自動關閉。程式亦可透過 System.exit() 或 Runtime.getRuntime().exit() 主動終止。

執行時資料區:記憶體劃分圖譜

JVM 運行時資料區架構圖

方法區

儲存已載入類型的元資料,屬於共享區域。核心內容:

  • 類基本資訊:全限定名、父類、介面、修飾符
  • 常量池、欄位表、方法表、靜態變數
  • 指向 ClassLoader 與 Class 物件的引用

HotSpot 以「永久代」實現方法區,JDK 8 移至元空間使用本地記憶體。

堆

  • 幾乎所有物件實例與陣列的分配區
  • 單一 JVM 實例僅有一個堆,所有執行緒共享
  • 各 Java 程式獨佔一個 JVM 實例,因此擁有獨立堆空間

堆是 GC 主戰場,分代收集(新生代/老年代)是核心策略。

Java 虛擬機棧

  • 執行緒私有,生命週期與執行緒同步
  • 以「棧幀」為單位儲存區域變數表、操作數棧、動態連結、方法返回地址
  • 僅支援兩種操作:壓棧(方法呼叫)、出棧(返回/拋異常)
  • 區域變數表以 Slot 為單位,可存基本類型、reference、returnAddress

棧幀結構:區域變數區 | 操作數棧 | 棧資料區(動態連結、方法出口等)

程式計數器

  • 執行緒私有,指向下一條將執行的位元組碼指令地址
  • 執行 Native 方法時值為 undefined
  • 唯一不會發生 OutOfMemoryError 的區域

本地方法棧

服務 native 方法執行,HotSpot 合併 Java 棧與本地方法棧實現。

類載入子系統

雙親委派模型

  • 啟動類載入器:C++ 實現,載入 <JAVA_HOME>/lib 下核心類庫
  • 使用者自定義類載入器:繼承 java.lang.ClassLoader,載入應用類

載入流程:載入 → 驗證 → 準備 → 解析 → 初始化。雙親委派保證核心類庫不被竄改,也避免重複載入。

執行引擎:核心中的核心

執行引擎同樣有三重含義(規範、實現、實例)。行為由位元組碼指令集定義,每條指令規定操作數棧變化與副作用。HotSpot 採用「解釋執行 + JIT 編譯」混合模式:熱點程式碼編譯為機器碼直接執行,兼顧啟動速度與峰值效能。

待深入主題

  • 即時編譯器優化技術(逃逸分析、標量替換、內聯)
  • 垃圾收集演算法與收集器參數調優
  • 類載入器自定義實現與模組化系統
  • JVM 監控與故障診斷工具鏈

JVM 知識體系浩瀚,建議配合 深入理解 Java 虛擬機、官方規範文檔與源碼閱讀,在生產環境調優中建立直覺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved