JVM 核心概念建立:資料類型分類、堆與棧的職責邊界、參數傳遞本質。
一、資料類型分類
| 分類 | 包含類型 | 特徵 |
| 基本類型 |
byte, short, int, long, char, float, double, boolean, returnAddress |
變數儲存**原始值**本身 |
| 引用類型 |
類類型、介面類型、陣列 |
變數儲存**引用值** (指向堆中物件的地址),非物件本身 |
二、堆與棧:職責分離的藝術

核心定位
- 棧 (Stack):**運行時單位** — 解決「程式如何執行、如何處理資料」
- 堆 (Heap):**儲存單位** — 解決「資料怎麼放、放在哪兒」
對應關係
- 每條線程對應**獨立線程棧** (執行邏輯各異)
- 堆為**所有線程共享**
儲存內容
| 棧 | 堆 |
| 區域變數 (基本型別 + 物件引用) |
物件實體 (所有 new 出來的物件) |
| 程式運行狀態、方法返回值、呼叫框架 |
僅負責物件資訊儲存 |
為什麼要分離?四大理由
- 軟體設計:棧代表處理邏輯,堆代表資料 — **分而治之、模組化**,邏輯更清晰
- 共享與交互:堆內容可被多棧共享 — **高效資料交互** (共享記憶體)、常量/快取共享節省空間
- 動態增長:棧只能向上增長、地址段固定 → 限制儲存能力;堆物件可**動態增長**,棧只需記錄堆地址 (4 bytes)
- 物件導向本質:物件屬性 → 資料 → **堆**;物件行為 (方法) → 邏輯 → **棧**。面向對象完美融合堆棧分離思想
三、關鍵執行細節
- 程式入口:
main 方法 = 棧的起始點 = 程式執行入口
- 參數傳遞本質:只有傳值 (Pass-by-Value)
- Java 無指標概念,勿與 C 類比
- 程式運行永遠在棧中,參數傳遞只有基本型別與物件引用 (皆為定長數值)
- 傳遞物件引用時,實為「傳引用的值」,棧中處理方式與基本型別完全一致
- 進入被呼叫方法後,引用值被解析到堆中物件,**修改的是堆中物件內容而非引用本身**,故修改可保持
- 物件樹狀觀:物件由基本型別組成。非葉子節點 = 物件引用,葉子節點 = 基本型別。參數傳遞值本身不可修改,但非葉子節點下的所有內容可修改
- 棧大小調整:
-Xss 設定。資料多時適當調大,否則拋 StackOverflowError (常見於無法返回的遞迴)
四、堆棧分離與 GC 的關係
程式可無堆 (純基本型別運算),但**不可無棧**。堆是為棧服務的共享記憶體。**正是堆棧分離思想,使 Java 垃圾回收成為可能** — GC 僅需掃描堆中物件引用拓撲,棧中引用作為 GC Roots 之一。
總結
基本類型存棧、物件存堆、引用存棧指向堆。參數傳遞統一為傳值 (引用值亦為值)。堆棧分離不僅是實作細節,更是支撐物件導向、共享記憶體、動態分配與自動 GC 的架構基石。