标记清理
- 变量进入上下文,会加上标记,证明其存在于该上下文
- 将所有在上下文中的变量以及上下文中被访问引用的变量标记去掉,表明这些变量活跃有用
- 在此之后再被加上标记的变量标记为准备删除的变量,原因是任何在上下文中的变量都访问不到它们
- 执行内存清理,销毁标记的所有非活跃值并回收之前被占用的内存
引用计数
引用计数策略相对而言不常用,弊端较多,其思路对每个值记录它被引用的次数,通过最后对次数的判断(引用数为0)来决定是否保留,具体规则:
- 声明一个变量,赋予它一个引用值,计数+1
- 同一值被赋予另外一个变量,引用+1
- 保存对该值引用的变量被其他值覆盖,引用+1
- 引用为0,回收内存
局限:容易造成循环引用
1 | function problem(){ |
a和b通过各自的属性相互引用,意味着它们的引用数都为2,在函数结束后,这两个对象不再作用域内,在引用计数策略下,a和b在函数结束后还会存在,因为它们的引用数永远捕获变为0,如果函数被多次调用就会导致大量内存永远不会被释放。