JavaScript的垃圾回收
JiaoXin2005 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
2
3
4
5
6
7
上述的例子中,a 与 b 通过各自的属性互相引用,意味着引用计数为 2,不会进行内存回收。在标记清除的策略下,不是问题。因为在函数执行之后,a 和 b 上下文都不存在了