内存泄漏
程序员文章站
2022-04-19 15:33:42
...
1》概念:不在用到的内存,没有及时释放,叫做内存泄漏
当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过系统分配的内存限额,这就造成了内存溢出
2》内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,就是溢出。
3》导致泄露
1>IE7/8DOM对象或者BOM对象循环引用
var a=new Object;
a.r=a;
原因:在IE中有一部分对象并不是原生js对象,其中DOM,BOM中的对象就是使用C++以COM对象的形式实现的,而COM对象就是使用的引用计数法。即使IE的js引擎使用的是标记清除法,但js访问COM对象仍然是基于引用计数法还是存在内存泄露的问题,在IE9中把DOM,BOM对象转换成了真正的js对象,避免了内存泄露问题。
2>闭包和事件绑定中的闭包
事件绑定中的闭包
解决的方法:使用jq的绑定事件,jQuery绑定事件最终都没有直接绑定到DOM对象上,而是使用jQuery缓存来绑定的,即使此时仍然会创建一个闭包,并且也会导致同前面一样的循环,但这里的代码却不会使 IE 发生内存泄漏。由于jQuery考虑到了内存泄漏的潜在危害,所以它会手动释放自己指定的所有事件处理程序(jQuery源代码$.fn.remove函数中有对节点的缓存释放的处理)。只要坚持使用jQuery的事件绑定方法,就无需为这种特定的常见原因导致的内存泄漏而担心。
2>当原DOM被移除时,子节点引用没有被移除则无法回收
var select = document.querySelector;
var treeRef = select('#tree');
var leafRef = select('#leaf'); //在COM树中leafRef是treeFre的一个子结点
select('body').removeChild(treeRef);//#tree不能被回收入,因为treeRef还在
解决方法:
treeRef = null;//tree还不能被回收,因为叶子结果leafRef还在
leafRef = null;//现在#tree可以被释放了
1>timer定时器的泄露
//解决方法,先停止定时器
clearTimeout(val);
buggyObject = null;