JavaScript的垃圾回收

3/2/2021 JavaScript

# 标记清除(目前主流浏览器的做法)

简单点来说,就是清除上下文标记的没用的变量。

当变量进入上下文,比如在函数 内部声明一个变量时,这个变量会被加上存在于上下文中的标记。而在上下文中的变量,逻辑上讲,永 远不应该释放它们的内存,因为只要上下文中的代码在运行,就有可能用到它们。当变量离开上下文时, 5 也会被加上离开上下文的标记。

# 引用计数

对每个值记录它被引用的次数。 举例:当一个变量被引用时,记录这个变量的引用数+1,如果保存改变量的值被其他值覆盖了,记录这个变量的引用数-1。当一个值的引用数为 0 时,意味着无法访问这个值了,因此可以安全地收回其内存了。

缺点:无法解决循环引用的场景

例如:

function fn() {
  let a = new Object();
  let b = new Object();

  a.foo = b;
  b.bar = a;
}
1
2
3
4
5
6
7

上述的例子中,a 与 b 通过各自的属性互相引用,意味着引用计数为 2,不会进行内存回收。在标记清除的策略下,不是问题。因为在函数执行之后,a 和 b 上下文都不存在了

Last Updated: 2/21/2022, 11:35:56 AM