没有合适的资源?快使用搜索试试~ 我知道了~
JavaScript_内存泄露
需积分: 9 1 下载量 114 浏览量
2010-10-09
08:50:41
上传
评论
收藏 110KB DOC 举报
温馨提示
试读
22页
介绍有关JavaScript_内存机制,以及避免内存泄露!
资源推荐
资源详情
资源评论
JavaScript 内存泄露
1、什么是闭包、以及闭包所涉及的作用域链这里就不说了。
2、JavaScript 垃圾回收机制
JavaScript 不需要手动地释放内存,它使用一种自动垃圾回收机制(garbage collection)。当一
个对象无用的时候,即程序中无变量引用这个对象时,就会从内存中释放掉这个变量。
Java 代码
var s = [ 1, 2 ,3];
var s = null;
//这样原始的数组[1 ,2 ,3]就会被释放掉了。
var s = [ 1, 2 ,3];
var s = null;
//这样原始的数组[1 ,2 ,3]就会被释放掉了。
3、循环引用
三个对象 A 、B 、C
A->B->C :A 的某一属性引用着 B,同样 C 也被 B 的属性引用着。如果将 A 清除,那么 B、C 也被
释放。
A->B->C->B :这里增加了 C 的某一属性引用 B 对象,如果这是清除 A,那么 B、C 不会被释放,
因为 B 和 C 之间产生了循环引用。Java 代码
var a = {};
a.pro = { a:100 };
a.pro.pro = { b:100 };
a = null ;
//这种情况下,{a:100}和{b:100}就同时也被释放了。
var obj = {};
obj.pro = { a : 100 };
obj.pro.pro = { b : 200 };
var two = obj.pro.pro;
obj = null;
//这种情况下 {b:200}不会被释放掉,而{a:100}被释放了。
var a = {};
a.pro = { a:100 };
a.pro.pro = { b:100 };
a = null ;
//这种情况下,{a:100}和{b:100}就同时也被释放了。
var obj = {};
obj.pro = { a : 100 };
obj.pro.pro = { b : 200 };
var two = obj.pro.pro;
obj = null;
1
//这种情况下 {b:200}不会被释放掉,而{a:100}被释放了。
4、循环引用和闭包
Java 代码
function outer(){
var obj = {};
function inner(){
//这里引用了 obj 对象
}
obj.inner = inner;
}
function outer(){
var obj = {};
function inner(){
//这里引用了 obj 对象
}
obj.inner = inner;
}这是一种及其隐蔽的循环引用,。当调用一次 outer 时,就会在其内部创建 obj 和 inner 两个对
象,obj 的 inner 属性引用了 inner;同样 inner 也引用了 obj,这是因为 obj 仍然在 innerFun 的封
闭环境中,准确的讲这是由于 JavaScript 特有的“作用域链”。
因此,闭包非常容易创建循环引用,幸运的是 JavaScript 能够很好的处理这种循环引用。
5、IE 中的内存泄漏
IE 中的内存泄漏有好几种,这里有详细的解释:
(http://msdn.microsoft.com/en-us/library/bb250448.aspx),
园子里也有翻译了:
(http://www.cnblogs.com/birdshome/archive/2006/05/28/ie_memoryleak.html)。
这里只讨论其中一种,即循环引用所造成的内存泄漏,因为,这是一种最普遍的情况。
当在 DOM 元素或一个 ActiveX 对象与普通 JavaScript 对象之间存在循环引用时,IE 在释放这类
变 量 时 存 在 特 殊 的 困 难 , 最 好 手 动 切 断 循 环 引 用 , 这 个 bug 在 IE 7 中 已 经 被 修 复 了
(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。
“IE 6 suffered from memory leaks when a circular reference between several objects, among which
at least one DOM node, was created. This problem has been solved in IE 7. ”
如果上面的例子(第 4 点)中 obj 引用的不是一个 JavaScript Function 对象(inner),而是一
个 ActiveX 对象或 Dom 元素,这样在 IE 中所形成的循环引用无法得到释放。Java 代码
function init(){
var elem = document.getElementByid( 'id' );
elem.onclick = function(){
2
alert('rain-man');
//这里引用了 elem 元素
};
}
function init(){
var elem = document.getElementByid( 'id' );
elem.onclick = function(){
alert('rain-man');
//这里引用了 elem 元素
};
}
Elem 引用了它的 click 事件的监听函数,同样该函数通过其作用域链也引用回了 elem 元素。这样
在 IE 中即使离开当前页面也不会释放这些循环引用。
6、解决方法
基本的方法就是手动清除这种循环引用,下面一个十分简单的例子,实际应用时可以自己构建一
个 addEvent()函数,并且在 window 的 unload 事件上对所有事件绑定进行清除。
Java 代码
function outer(){
var one = document.getElementById( 'one' );
one.onclick = function(){};
}
window.onunload = function(){
var one = document.getElementById( 'one' );
one.onclick = null;
};
JavaScript 中的内存泄漏
JavaScript 是一种垃圾收集式语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没
有对该对象的引用时由浏览器收回。JavaScript 的垃圾收集机制本身并没有问题,但浏览器在为
DOM 对象分配和恢复内存的方式上却有些出入。
Internet Explorer 和 Mozilla Firefox 均使用引用计数来为 DOM 对象处理内存。在引用计数系统,
每个所引用的对象都会保留一个计数,以获悉有多少对象正在引用它。如果计数为零,该对象就会
被销毁,其占用的内存也会返回给堆。虽然这种解决方案总的来说还算有效,但在循环引用方面却
存在一些盲点。
原因
1)循环引用导致了内存泄漏
<html>
<body>
<script type="text/javascript">
document.write("circular references between JavaScript and DOM!");
var obj;
window.onload = function(){
3
obj=document.getElementById("DivElement");
document.getElementById("DivElement").expandoProperty=obj;
obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
};
</script>
<div id="DivElement">Div Element</div>
</body>
</html>
2)由外部函数调用引起的内存泄漏
<html>
<head>
<script type="text/javascript">
document.write(" object s between JavaScript and DOM!");
function myFunction(element)
{
this.elementReference = element;
// This code forms a circular reference here
//by DOM-->JS-->DOM
element.expandoProperty = this;
}
function Leak() {
//This code will leak
new myFunction(document.getElementById("myDiv"));
}
</script>
</head>
<body onload="Leak()">
<div id="myDiv"></div>
</body>
</html>
3)闭包引起的内存泄漏
function parentFunction(paramA){
var a = paramA;
function childFunction(){
return a + 2;
}
return childFunction();
}
4)由事件处理引起的内存泄漏模式
<html>
<body>
<script type="text/javascript">
document.write("Program to illustrate memory leak via closure");
4
剩余21页未读,继续阅读
资源评论
sunshinesjw
- 粉丝: 1
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- asp代码ASP基于WEB楼宇专业网站毕业设计(源代码+论文)
- 九宫重排.docx 验证重排后的九宫格是否满足所有条件,包括每行、每列和每个子区域的目标和值相等,以及是否包含1到9的所有数字
- asp代码ASP基于WEB聊天室的设计与实现(源代码+论文+任务书)
- 质数的判断条件.docx
- android-ocr-master,android-ocr-master
- asp代码ASP基于WEB教学评估系统设计(源代码+论文)
- asp代码ASP基于WEB购物系统(论文+源代码+开题报告+答辩PPT+操作说明)
- quartus ii安装教程.docx
- 基于Django框架的后台管理系统设计源码
- 众数问题.docx "众数"是统计学中的一个概念,指的是一组数据中出现次数最频繁的值
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功