内存泄漏定义:
无效引用即无法被程序使用,但又没有被系统回收的内存。
垃圾回收(GC)原理:标记-清除算法
(1) 垃圾回收机制维护一系列的根节点,例如window,globle对象等,这些根节点所占用的内存不会被回收;
(2)从根节点出发,递归的检查子节点,根节点和所有子节点都标记为引用状态,内存不会被回收;
(3)所有没有标记的内存块,视为垃圾内存,自动回收,由系统重新分配;
几种常见的内存泄漏
(1)全局变量:xxx === window.xxx
解决办法: var let const ; 如果不得不使用全局变量,引用之后,手动设置xxx=null
(2)setInterval中引用的变量和对象:未清除定时器,这些变量和对象一直存在内存中
解决办法:clearInterval()清除定时器
(3)dom事件没有移除: dom节点被移除但事件依然存在内存中
解决办法:removeEventListener
(4)循环引用:
var a=new Object; var b=new Object;
a.r=b; b.r=a;
这种情况下,老的计数算法(IE6 IE7)会存在内存泄漏,标记清除算法不会内存泄露!
(5)dom移除:
var select = document.querySelector;
var treeRef = select('#tree');
var leafRef = select('#leaf'); //在COM树中leafRef是treeFre的一个子结点
select('body').removeChild(treeRef);//#tree不能被回收入,因为treeRef还在
(6) 闭包