Stack 堆疊 / Queue 佇列 / Heap 堆

Node.js Stack 堆疊 / Queue 佇列 / Heap 堆

Stack 堆疊

後進先出 (LIFO, Last in First out)

  • 自動分配記憶體空間
  • 系統自動釋放記憶體空間
  • 比較簡單類型的 Primitive Type 會被放在 stack 裡
    • string: 存在 Heap 裡,且 V8 會 maintain 一個字串的 hashmap,如果是相同字串,就會引用相同的記憶體位置。
    • number: 某些類型例如 smallint 會存在 Stack 中,其他類型則存在 Heap 裡。

事件

Queue 佇列

先進先出 (FIFO, First in first out)

事件

Heap 堆

  • 比較複雜類型的 Reference Type 則會把資料存在 heap 中,再把資料在 heap 的記憶體位址記錄到 stack 裡

Stack 與 Heap 資料存放方式

let name = 'Kay'
let age = 17;
let Employee = {
  name : 'Jay',
  age: 19
};
let Job = ['Software Engineer', 'Technical Manager'];
Stack 變數 Stack 資料 Heap 位址 Heap 資料
name Kay 0xAddress_1 {name: 'Jay', age: 19}
age 17 0xAddress_2 ['Software Engineer', 'Technical Manager']
Employee 0xAddress_1
Job 0xAddress_2
  • 比較簡單類型的 Primitive Type 會被放在 stack 裡
  • 比較複雜類型的 Reference Type 則會把資料存在 heap 中,再把資料在 heap 的記憶體位址記錄到 stack 裡

常見問題

為什麼不把所有數據存到 Stack 裡就好?

JS Engine 是透過 stack 來維護 Execution Context 的切換狀態,如果 Stack 太過肥大,會影響 Context Switch 的執行效率,連帶影響到整個程式執行的效率。

參考資料