我们都知道,JS是自动进行垃圾回收,回收算法有两种:标记清除和引用计数
- 标记清除
程序在运行的时候,垃圾回收机制会被所有在内存里面的变量都打上标记,然后会去掉运行环境中用到的和被引用的变量。下一次垃圾回收运行的时候,就会把带有标记的变量内存进行释放。 - 引用计数
程序运行的时候,运行环境中用到和被引用的变量会被计数,每被应用一次就+1,下一次垃圾回收运行的时候把引用计数为0的变量释放。
那以上就是两种主要的垃圾回收算法,下面再说说平常比较容易出现内存泄露的地方
- 清空对应的dom的四号, 绑定事件未解绑,通过addEventListener为解绑
- 函数闭包变量为手动释放
- 集成框架中如react,在初始化的时候添加事件,在destroy的时候没有解绑事件
- setTimeout/setInterval,定时器用完没有clear掉
- 全局对象,特别是未定义的全局变量
- 死循环
- 循环引用,比如A对象中引用B对象,B对象引用A对象。
const A = {};
const B = {A};
const A.B = B;
性能问题
垃圾收集器是周期性运行的,而且如果为变量分配的内存数量很可观,那么回收工作量也是相当大的.在这种情况下,确定垃圾收集的时间间隔是一个非常重要的问题.
IE7发布的时候,其 JavaScript 引擎的垃圾收集例程改变了工作方式:触发垃圾收集的变量分配,字面量和(或)数组元素的临界值被调整为动态修正.IE7 中的各项临界值在初始时与 IE6 相等.如果垃圾收集例程回收的内存分配量低于 15%,则变量,字面量和(或)数组元素的临界值就会加倍.如果例程回收了 85%的内存分配量,则将各种临界值重置回默认值.
网友评论