一、垃圾收集
代码语言:javascript复制* 什么是垃圾:
* 一般来说,没有被引用的对象就是垃圾,就要被清除。
* 有个例外,如果几个对象引用形成一个环,它们互相引用,但是根访问不到它们,这几个对象也是垃圾,也要被清除。
* 垃圾回收GC的全拼是 Garbage Collection 其在维基百科的定义是:在计算机科学中,垃圾回收是一种自动的内存管理机制。
* 当一个电脑上的动态内存不再需要时,就应该予以释放,以让出内存,这种内存资源管理,称为垃圾回收。
* JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。
* 垃圾收集机制的原理:
* 找出那些不再继续使用的变量,然后释放其占用的内存。
* 为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作。
二、算法
1、标记清除(Mark-Sweep GC)
代码语言:javascript复制* 标记阶段:从根集合出发,将所有活动对象及其子对象打上标记
* 清除阶段:遍历堆,将非活动对象(未打上标记)的连接到空闲链表上
* 优点
* 实现简单,容易和其他算法组合
* 缺点
* 碎片化,会导致无数小分块散落在堆的各处
* 分配速度不理想,每次分配都需要遍历空闲列表找到足够大的分块
* 与写时复制技术不兼容,因为每次都会在活动对象上打上标记
2、引用计数(Reference Counting)
代码语言:javascript复制* 引用计数,就是记录每个对象被引用的次数,每次新建对象、赋值引用和删除引用的同时更新计数器,
如果计数器值为0则直接回收内存。很明显,引用计数最大的优势是暂停时间短。
* 优点
* 可即刻回收垃圾
* 最大暂停时间短
* 没有必要沿指针查找,不用和标记清除算法一样沿着根集合开始查找
* 缺点
* 计数器的增减处理繁重
* 计数器需要占用很多位
* 实现繁琐复杂,每个赋值操作都得替换成引用更新操作
* 循环引用无法回收
3、其它算法
代码语言:javascript复制* 标记-压缩(Mark-Compact)
* GC复制算法
* 保守式GC
* 分代回收
* 增量式GC
* 三色标记算法
三、解除引用
代码语言:javascript复制* 一旦数据不再有用,最好通过将其值设置为null来释放其引用,这个做法叫做解除引用(dereferencing)。
* 这一做法适用于大多数全局变量和全局对象的属性。
* 局部变量会在它们离开执行环境时自动被解除引用。