許多 Java 初學者在閱讀「JVM 記憶體模型」或「資料結構」章節時,會看到「堆疊」一詞,直覺以為這就是電腦主機板上插的那根實體「記憶體條(RAM)」。這是一個經典的誤解。
在程式執行的邏輯視角中,堆疊是記憶體中的一塊連續區域,由作業系統在建立執行緒時自動分配。它的運作模式遵循 LIFO(後進先出,Last In First Out) 原則,就像一個只能從頂端放入、取出資料的「水桶」或「彈匣」。
StackOverflowError。記憶體條是硬體層面的儲存介質,提供位元組可定址的儲存空間。作業系統將其劃分為頁框,映射給各行程的虛擬位址空間。堆疊、堆積、方法區、程式碼段等邏輯區域,最終都映射到這塊物理 RAM 上(或交換檔/虛擬記憶體)。
| 維度 | 程式邏輯上的 Stack (堆疊) | 硬體層面的 RAM (記憶體條) |
|---|---|---|
| 層級 | 軟體/邏輯概念 (JVM/OS 抽象) | 硬體/物理實體 |
| 管理者 | JVM / 作業系統核心 | 記憶體控制器 / CPU |
| 存取單位 | 幀 - 對應方法呼叫 | 位元組 / 快取行 |
| 生命週期 | 隨執行緒建立/銷毀 | 電腦開機即存在 |
| 大小 | 可配置 (如 -Xss) | 固定規格 (8GB, 16GB...) |
記憶體條 = 一整棟大樓(物理空間)
堆疊 = 大樓裡的一間「專用電梯井」,只能垂直上下,進出順序嚴格(LIFO)
堆積 = 大樓裡的「大型開放式辦公室」,靈活分割、隨意申請釋放,但需清潔工定期整理
下次看到書上寫「區域變數存放在堆疊中」,請理解為:「這些資料被安排在執行緒私有的、由 JVM 自動管理的、遵循 LIFO 規則的那塊邏輯記憶體區域裡」,而不是「存進記憶體條的某個特定物理插槽」。區分「邏輯結構」與「物理實體」,是通往系統級程式設計的基石。