引言
記憶體管理是 Java 的核心優勢,亦是 OOM 與洩漏問題的溫床。理解 JVM 記憶體結構是性能調優與故障排查的基石。
JVM 規範與實作
- 規範:Oracle 制定的《Java 虛擬機規範》,定義記憶體結構、指令集、類別檔格式等。
- 實作:如 HotSpot、J9、GraalVM 等具體產品。本文以 HotSpot 為主。
執行時資料區六大區域

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 原理與實戰調優。