# 浏览器内存回收机制


垃圾回收机制(gc)分为:标记-清除算法与引用计数垃圾收集

# 标记-清除算法

在JavaScript中,标记清除是最常用的方式.

例如:在函数中声明一个变量,就将这个变量定义为“进入环境”。从逻辑上讲 进入环境的变量其内存不能被释放,因为只要有流执行,这些变量都可能被用到。当变量离开环境后,解释器标记其为“离开环境”,此时,当垃圾收集器,在下个周期时就会回收这部分的内存.

function foo(){
  let num = 1; //被标记,进入环境
  let count = 60; //被标记,进入环境
}

foo(); //函数执行完毕,num,count被标记为离开环境,被gc回收

1
2
3
4
5
6
7

# 引用计数垃圾收集

这个算法假定设置一个叫做根(root)的对象(在Javascript里,根是全局对象)。定期的,垃圾回收器将从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和所有不能获得的对象。可以获得的对象,将不会被垃圾回收器回收,不能获得的对象将会被垃圾回收器回收,从而达到释放内存的目的. 具体实现:

function obj(){
  let a={};//定义a引用对象 初始化 a引用次数为0
  let b=a;//a被引用次数1
  let c=a;//a被引用次数2
  b={};//因b引用被切断,此时上下文a的引用次数减一,引用次数变为1
  c=[];//同上此时a的引用次数为0,内存等待回收
}

1
2
3
4
5
6
7
8

如上code:a的引用计数为0,对象不再被使用,等待垃圾收集器回收. 理论上,如果按照以上的原理进行coding,内存是能够及时被回收掉,有效的节省内存资源.