Stack vs. Heap

Joe Tsai
Joe Blog
Published in
2 min readNov 21, 2017

這兩個東西常常搞混,避免下次忘記的時候沒東西看,我決定把它記下來。這篇是看完 Confused about Stack and Heap? 之後做的一點筆記。

Stack (棧)

用來儲存 Value Types (Primitives)的地方,其特性是 LIFO (後進先出),用來儲存物件的 stack 與 run-time 的 call stack 運作原理是一樣的,run-time 的 stack frame 包含了:

  • Parameters:函數的參數
  • Return address:回傳位址,當function執行完,從哪行code繼續執行
  • Local variables:區域變數

Stack frame 存活時間是規律可預測的,只存在於 function 的執行期間,一旦 function 執行完畢,系統會自動回收空間,不需要擔心 Memory Leak 在這裡發生。

Heap (堆)

用來儲存 Reference Types,new 一個物件即是存在 Heap 裡面,由於是動態配置記憶體空間,其存活時間不規律不可預測的,即使已經執行完動態配置的 function ,物件仍可能存在 Heap 中,這邊會因程式語言有沒有 GC 功能而有所不同:

  • 沒有 GC :像 C++ 就需要用 delete 語法來清除物件
  • 有 GC:Java 的 Garbage collector 為了防止 memory leak 會自動釋放 heap 上的記憶體空間

--

--