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

JVM 記憶體管理全景指南:執行時資料區劃分、PC 寄存器、虛擬機棧、堆、方法區、常量池、本地方法棧詳解

     編輯:Java 相關知識

引言

記憶體管理是 Java 的核心優勢,亦是 OOM 與洩漏問題的溫床。理解 JVM 記憶體結構是性能調優與故障排查的基石。

JVM 規範與實作

  • 規範:Oracle 制定的《Java 虛擬機規範》,定義記憶體結構、指令集、類別檔格式等。
  • 實作:如 HotSpot、J9、GraalVM 等具體產品。本文以 HotSpot 為主。

執行時資料區六大區域

JVM 記憶體結構圖

1. 程序計數器 — 線程私有

  • 指示當前線程執行的字節碼指令地址;Native 方法則為空。
  • 唯一不會 OOM的區域,無需 GC。

2. Java 虛擬機棧 — 線程私有

  • 生命週期與線程同步。儲存棧幀。
  • 棧幀包含:局部變量表、操作數棧、動態連結、方法返回地址、異常處理表。
  • 局部變量表:編譯期確定大小,索引 0 為 this(實例方法),基本類型佔 1 Slot,long/double 佔 2 Slots。
  • 操作數棧:LIFO,字節碼指令運算工作區。
  • 異常:StackOverflowError(深度過大)、OutOfMemoryError(無法擴展)。

3. Java 堆 — 線程共享,GC 主戰場

  • 啟動時創建,儲存所有物件實例與陣列。
  • 邏輯上可分代:新生代、老年代;物理上可不連續。
  • 可透過 -Xms/-Xmx 設定初始/最大值。
  • 現代 GC(G1、ZGC、Shenandoah)採用區域化設計,不再嚴格物理分代。

4. 方法區 — 線程共享

  • 儲存類別元資料、常量、靜態變數、即時編譯器產生的程式碼緩存。
  • 規範不強制要求 GC,但實作通常會回收廢棄常量與無用類別。
  • HotSpot 8 起移除永久代,改用元空間,使用本地記憶體。
  • 參數:-XX:MetaspaceSize、-XX:MaxMetaspaceSize。

5. 執行時常量池 — 方法區一部分

  • Class 檔常量池的執行時映射,含字面量、符號引用。
  • 具備動態性:String.intern() 可在運行時加入新常量。

6. 本地方法棧 — 線程私有

  • 支援 native 方法執行(C/C++ 實現)。
  • 若 VM 不支援 native,則無此區域。

記憶體管理兩大面向

  • 線程私有區:隨線程生死自動分配/釋放,由 VM 直接管理,無 GC 介入。
  • 共享區:分配由 new 觸發,釋放由 GC 自動管理。分配策略(TLAB、指針碰撞、空閒列表)與 GC 演算法(標記-清除、複製、標記-整理、分代、分區)緊密相關。

結語

掌握六大區域職責與參數調優,是進階 Java 工程師的必修課。後續將深入 GC 原理與實戰調優。

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