欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内存泄漏

程序员文章站 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;