0%

浏览器垃圾回收机制

标记清理

  • 变量进入上下文,会加上标记,证明其存在于该上下文
  • 将所有在上下文中的变量以及上下文中被访问引用的变量标记去掉,表明这些变量活跃有用
  • 在此之后再被加上标记的变量标记为准备删除的变量,原因是任何在上下文中的变量都访问不到它们
  • 执行内存清理,销毁标记的所有非活跃值并回收之前被占用的内存

引用计数

引用计数策略相对而言不常用,弊端较多,其思路对每个值记录它被引用的次数,通过最后对次数的判断(引用数为0)来决定是否保留,具体规则:

  • 声明一个变量,赋予它一个引用值,计数+1
  • 同一值被赋予另外一个变量,引用+1
  • 保存对该值引用的变量被其他值覆盖,引用+1
  • 引用为0,回收内存

局限:容易造成循环引用

1
2
3
4
5
6
function problem(){
let a=new Object()
let b=new Object()
a.c=b;
b.d=a;
}

a和b通过各自的属性相互引用,意味着它们的引用数都为2,在函数结束后,这两个对象不再作用域内,在引用计数策略下,a和b在函数结束后还会存在,因为它们的引用数永远捕获变为0,如果函数被多次调用就会导致大量内存永远不会被释放。