JS内存空间详解(摘录)

js具有自动垃圾回收机制,垃圾回收的方法有两种:标记清除法、计数清除法

垃圾回收的实现算法:

  • 垃圾回收器创建一个"roots"列表。Roots通常是代码中全局变量的引用。JavaScript中,"window"对象是个全局变量,被当做root。window对象总是存在,因此垃圾回收器可以检查它和它的所有子对象是否存在(即不是垃圾);
    2,所有的roots被检查和标记为激活(即不是垃圾)。所有的子对象也被递归检查。从root开始的所有对象如果是可达的,它们就不被当做垃圾。
    3.所有未被标记的内存会被当做垃圾,收集器现在可以释放内存,归还给操作系统了。

简言之:垃圾回收器会从window开始递归的标记window下的所有子对象,在能访问到的子对象上做个标记,而没有被标记的就视为垃圾,收集器会将他们释放掉,window只是roots之一,对于其他对象来说也是一样的。

堆与栈

  • JS变量类型有两种:
    • 基本数据类型:Number、String、Boolean、null、undefined)
  • 复杂数据类型(引用数据类型):Object、Function、Array
  • 栈:遵循后进先出,先进后出的原则,属于一级缓存,地位相当于cpu寄存器,有编译器自动分配释放,读写快,存储的都是固定值(基本数据类型)
  • 堆:属于二级缓存,由我们分配释放,要是没有手动释放在调用结束后可能有GC回收,其生命周期由虚拟的垃圾回收算法来决定。存储的是引用类型。

在JS中是不允许直接操作堆的,所以栈和堆的区分不是那么严谨,只要用到了堆,必然也用到了栈,
eg:

var a = 1,

  b = {m:20};
JS内存空间详解(摘录)_第1张图片
图解

如上可以看一看出栈内存中变量b存的是一个地址:(引用地址,这个地址存放的就是{m:20}),js操作的是这个引用地址,而这个地址存放在栈中。如果我们改变b的值,{m:20}会被os清理掉

os :另一种回收条件 - 计数清除,讲一个引用类型的值赋给一个变量,那么这个引用类型的值得引用次数就会加1,相反,如果这个变量赋值了其他值,这个引用类型的值得引用次数就减1,当引用次数为0时,就没有办法在访问这个引用类型的值了,那么它所占的内存空间就会被垃圾回收器回收。

深浅复制:

浅复制:复制地址;
深复制:直接将堆中存放的数据复制一份

你可能感兴趣的:(JS内存空间详解(摘录))