垃圾回收机制与内存泄漏

内存分配

js 在定义变量时就完成了内存分配

垃圾回收算法

引用计数垃圾收集

最初级的垃圾收集算法,此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”.如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收

限制:循环引用

该算法无法处理循环引用,示例

function f() {
    var o = {};
    var o2 = {};
    o.a = o2;
    o2.a = o;
    return 'azerty';
}
f();

标记-清除算法

该算法把“对象是否不再需要”简化定义为“对象是否可以获得”

限制:那些无法从根对象查询到的对象都将被清除。该限制在实践中很少会碰到

常见内存泄漏

意外的全局变量

如果必须使用全局变量存储大量数据时,确保用完以后把它设置为 null 或者重新定义。

被遗忘的计时器或回调函数

脱离 DOM 的引用

例如:

<div><span></span></div>

在代码中保存了 span 的引用,在后面删除整个 div 的时候,此时 span 仍然在内存中保存,并未一起删除

闭包

闭包的特性使得它们很容易导致内存溢出,所以使用的时候要注意

内存泄漏定位

chrome devtools:memory、performance

Last Updated:
Contributors: zhangfei