JS内存空间

35 阅读2分钟

js:具有自动的垃圾回收机制。

找出那些不再继续使用的变量,然后释放其占用的内存。

回收的方式:

  • (1)标记清除【js中常用】
  • (2)引用计数

js没有严格意义上区分栈内存与堆内存,可以简单理解为JavaScript的所有数据都保存在堆内存中。

1 栈(stack)

js执行上下文的执行顺序借用了栈数据结构的存取方式。(函数调用栈)

栈数据结构:先进后出,后进先出。

2 堆(heap)

堆数据结构:树状结构,

好比在JSON格式的数据中,我们存储的key-value是可以无序的,顺序的不同并不影响我们的使用。

3 队列(queue)

先进先出(FIFO)的数据结构。

4 变量对象与基础数据类型

JS的执行上下文生成后,会创建一个叫变量对象的特殊对象,js的基础数据类型会保存在变量对象中。(严格来说:变量对象也是存放于堆内存中,由于变量对象的特殊职能,理解时单独区分)

基础数据类型:简单的数据段,按值访问,可直接操作保存在变量中的实际值,js中5中基础数据类型:Undefined、Null、Boolean、Number、String。(暂不考虑ES6的Symbol)

5 引用数据类型与堆内存

JS的引用数据类型(数组Array)值的大小是不固定的,其值是保存在堆内存中的对象。

JavaScript不允许直接访问堆内存中的数据,因此不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,我们可以理解为保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。

image.png

6 内存空间管理

JavaScript的内存生命周期

  1. 分配你所需要的内存
  2. 使用分配到的内存(读、写)
  3. 不需要时将其释放、归还