内存泄漏

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;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值