首页 > 编程语言 > 详细

JavaScript内存泄漏

时间:2017-02-13 13:33:26      阅读:213      评论:0      收藏:0      [点我收藏+]

内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。

在C++中,因为是手动管理内存,内存泄露是经常出现的事情。而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露。

浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。

导致内存泄漏的方式

不同的浏览器中存在各种内存泄露方式,目前发现的主要是这样几种:

1、循环引用

已经确认存在泄漏的浏览器:IE6.0 FF2.0

含有DOM对象的循环引用将导致大部分当前主流浏览器内存泄露 这里有两个简单的概念

引用:a.属性=b,a就引用了b

循环引用:简单来说假如a引用了b,b又引用了a,a和b就构成了循环引用。

a和b循环引用:

1 var a=new Object;
2 var b=new Object;
3 a.r=b;
4 b.r=a;

a循环引用自己:

1 var a=new Object;
2 a.r=a;

循环引用很常见且大部分情况下是无害的,但当参与循环引用的对象中有DOM对象或者ActiveX对象时,循环引用将导致内存泄露。我们把例子中的任何一个new Object替换成document.getElementById或者document.createElement就会发生内存泄露了。

尽管这看起来非常容易理解,但是因为有closure的参与而使事情变得复杂,有些closure导致的循环引用很难被察觉。下面是一个非常常见的动态绑定事件:

1 function bindEvent()
2 {
3     var obj=document.createElement("XXX");
4     obj.onclick=function(){
5         //Even if it‘s a empty function
6     }
7 }

这个bindEvent执行时100%会发生内存泄露,有人可能会问,哪里出现了循环引用? 关于closure和scope chain参与的循环引用比较复杂,此处暂不深入讨论。有一个简单的判断方式:函数将间接引用所有它能访问的对象。obj.onclick这个函数中 可以访问外部的变量obj 所以他引用了obj,而obj又引用了它,因此这个事件绑定将会造成内存泄露。

 

JavaScript内存泄漏

原文:http://www.cnblogs.com/xuepei/p/6393211.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!