俗話說得好:「自己寫的代碼,六個月後也是別人的代碼。」定期複習、總結核心知識點,是工程師精進的必經之路。本文將圍繞技術文獻中高頻出現的「堆」、「棧」、「堆棧」等概念,從數據結構、語言實現、作業系統底層三個維度進行深度解析,幫你建立清晰的知識地圖。
在深入探討之前,先回顧 JVM 運行時數據區的核心劃分:
許多初學者受 C++ 翻譯誤導,以為「堆棧」指的是 Heap。實際上,Stack 的中文正確翻譯應為「棧」。「堆棧」一詞源自英文 Stack 的音譯,意指記憶體中具備「先進後出」特性的區域,位於 RAM,速度僅次於暫存器。
核心差異:棧儲存基本類型與引用,要求資料大小與生命週期確定;堆儲存對象實例,支援動態分配,大小不固定,由 GC 管理。
JVM 規範定義了 Java 虛擬機棧與 Native 方法棧,但 HotSpot VM 採用 Mixed Stack(混合棧) 設計,將 Java 方法框架與 Native 方法框架融合在同一個呼叫棧中。因此,每個 Java 執行緒實際上只擁有一個調用棧。

堆用於存放對象,棧用於執行程序。 Java 採用自動 GC 管理堆,C/C++ 需手動 new/delete。Java 物件實體在堆,引用在棧;C++ 兩者皆可由程式設計師控制。
以 Linux 32 位進程虛擬地址空間為例:

| 特性 | 棧 | 堆 |
|---|---|---|
| 增長方向 | 向下(高址→低址) | 向上(低址→高址) |
| 管理方式 | CPU 指令自動管理 | 運行時庫維護鏈表 |
| 分配速度 | 極快(指針移動) | 較慢(查找合適塊) |
| 碎片問題 | 無 | 易產生記憶體碎片 |
| 擴展性 | 固定大小,難擴展 | 可動態擴展 |
本質上,並非「必須」用棧,而是棧完美契合方法調用的 FILO 生命週期特徵:
若 CPU 擁有無限暫存器,理論上可拋棄棧。但現實中暫存器稀缺,棧成為最經濟、高效的實現方案。堆無序特性無法支援這種嚴格的巢狀調用邏輯。
本文梳理了從數據結構到 OS 底層的完整知識鏈條。理解這些本質,能幫助你在排查 OOM、StackOverflow、效能調優時直擊核心。
參考資料:《Java編程思想》、《現代作業系統》、《深入理解計算機系統》、《現代編譯原理》、《深入理解Java虛擬機》、《JVM規範 7》、知乎、StackOverflow 精選答疑。