這兩個東西常常搞混,避免下次忘記的時候沒東西看,我決定把它記下來。這篇是看完 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 上的記憶體空間