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 的执行效率,连带影响到整个程式执行的效率。

参考资料