Skip to content

垃圾回收机制

手动清除

将对象设置为Null即可清除

浏览器performance的清除按钮

堆空间

v8会把堆分为两区域

老生代区域:储存老生代对象,持久性强,无法立即回收,例如DOM,闭包,定时器,监听器,异步函数,大容量,使用主垃圾回收器

新生代区域:新生代对象,使用完立马回收,比如内部变量,1-8M容量,使用副垃圾回收器

可达值

部分值是不能被释放的,这些值被称作根,比如:

  • 当前正在执行的函数或者调用链中的函数的内部变量
  • 全局对象

如果一个值能通过引用链从访问到,则认为该值是可达

例如window.obj = {a:'b'}{a:'b'}这个对象被obj引用了,所以它是可达的,'b'这个值也是可达的,如果window.obj = null,那这个引用就没了

垃圾回收机制

主垃圾回收器

这类垃圾一般占用空间大,并且存活时间长,使用标记清除法回收

  • 标记

    找到根对象并遍历来自根的引用,没标记的就是垃圾数据

  • 清除

    清除垃圾数据

  • 优点

    可以回收互相引用的值

  • 缺点

    可达值在内存区域中可能是不连续的,因此会产生内存碎片

    回收的时候会阻塞js进程,导致用户体验差

副垃圾回收期

这类垃圾内存占用比较小,通常只有1-8M容量,使用标记整理法

新生代被分为两个区域:对象区和空闲区

新加入的对象都被放入对象区,对象区快满的时候进行一次垃圾清理

首先给对象区的获得对象做标记,复制到空闲区,并有序的排列一遍

复制完成后对象区和空闲区进行对调