垃圾回收机制与内存泄漏
内存分配
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