- 浏览: 994693 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (367)
- JavaScript (23)
- Java (60)
- Python (41)
- 其他 (36)
- SQL (4)
- 开发工具 (26)
- Linux (15)
- AJAX (6)
- Cache (3)
- 正则 (4)
- 架构 (9)
- 手机 (3)
- MySQL (4)
- Android (115)
- vps (1)
- 网站 (4)
- scale (3)
- 搜索引擎 (3)
- iPhone (2)
- hessian (1)
- hessdroid (1)
- 411 (1)
- jstat (1)
- gc (1)
- gallery (1)
- 惯性 (1)
- eclipse (1)
- mac wget error (1)
- miui file explorer 无用 解决办法 (1)
- vim (1)
最新评论
-
qingyezhangluo:
哎。楼主您既然是分享代码的为什么要加密的呢?而且问你密码还不回 ...
android应用换皮肤(转) -
MagicError:
kavoe 写道下载文件有密码。。。。
http抓包工具 -
knightdf:
我先试下再来
JAVA的RAS加密例子 -
kavoe:
下载文件有密码。。。。
http抓包工具 -
changanfounder:
hmc1985 写道setCallbackDuringFlin ...
android gallery滑动惯性问题
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(){
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");
window.onload=function outerFunction(){
var obj = document.getElementById("element");
obj.onclick=function innerFunction(){
alert("Hi! I will leak");
};
obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
// This is used to make the leak significant
};
</script>
<button id="element">Click Me</button>
</body>
</html>
解决方法
1)打破循环引用
<html>
<body>
<script type="text/javascript">
document.write("Avoiding memory leak via closure by breaking the circular reference");
window.onload=function outerFunction(){
var obj = document.getElementById("element");
obj.onclick=function innerFunction()
{
alert("Hi! I have avoided the leak");
// Some logic here
};
obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
obj = null; //This breaks the circular reference
};
</script>
<button id="element">"Click Here"</button>
</body>
</html>
2)添加另一个闭包
<html>
<body>
<script type="text/javascript">
document.write("Avoiding a memory leak by adding another closure");
window.onload=function outerFunction(){
var anotherObj = function innerFunction(){
// Some logic here
alert("Hi! I have avoided the leak");
};
(function anotherInnerFunction(){
var obj = document.getElementById("element");
obj.onclick=anotherObj
})();
};
</script>
<button id="element">"Click Here"</button>
</body>
</html>
3)避免闭包自身
<html>
<head>
<script type="text/javascript">
document.write("Avoid leaks by avoiding closures!");
window.onload=function(){
var obj = document.getElementById("element");
obj.onclick = doesNotLeak;
}
function doesNotLeak(){
//Your Logic here
alert("Hi! I have avoided the leak");
}
</script>
</head>
<body>
<button id="element">"Click Here"</button>
</body>
</html>
4)考虑用CollectGarbage()
jcl.MemFree = function(Mem){
Mem = null;
CollectGarbage();
};
检测软件
sIEve: 他是基于ie的内存泄露检测工具,需要下载运行,http://home.wanadoo.nl/jsrosman/
Leak Monitor: 他是基于firefox的内存泄露检测工具,https://addons.mozilla.org/firefox/2490/
个人建议
内存回收机制本身有问题,所以开发人员开发的时候尽量减少内存溢出。不要盲目的追求完美!
评论
苦恼啊,不知道还会有什么原因。
richardroky@gmail.com
发表评论
-
网站 变灰 兼容各浏览器
2010-08-23 17:28 84<script src="gray ... -
js小技巧
2009-12-10 16:24 1019感谢:http://hi.baidu.com/lundy521 ... -
prototype 1.6
2009-07-08 18:41 827http://www.never-online.net/blo ... -
display:blocK 导致的换行
2009-04-03 19:01 5250#divHeader #divNav #divLogo{mar ... -
jQuery插件---按需加载JavaScript和CSS.
2009-04-02 18:12 4040jQuery插件---按需加载JavaScript和CSS. ... -
JavaScript中的Timer是怎么工作的
2009-03-19 14:35 1434JavaScript中的Timer是怎么 ... -
JS踢掉HTML TAG
2009-02-26 17:31 1010function delHtmlTag(str){ ... -
json 格式化工具
2009-02-20 16:31 2798http://lab.gracecode.com/format ... -
javascript+dom更改html内容总结
2009-02-19 18:01 2350利用JavaScript和dom结合来动态改变HTML内容。1 ... -
网页中嵌入Flash的几种方法(消除IE控件激活虚线)
2009-01-15 15:47 2617Flash 嵌入的问题论坛中有人问了好多次,到底应该怎么用,为 ... -
js压缩
2009-01-13 15:57 1134http://dean.edwards.name/packer ... -
json注意事项
2009-01-11 18:44 12721.JavaScript 用eval 经行转换json数据时。 ... -
Cookie的规范介绍
2009-01-05 16:20 1199Cookie的规范介绍 目前有 ... -
cookie(1)
2009-01-05 16:19 1050我们已经知道,在 document 对象中有一个 cookie ... -
js压缩
2008-12-28 19:26 1250js压缩,既可压缩,又可简单加密 先去这个网站 http:// ... -
郁闷。。。
2008-12-27 16:34 1090搞了大半天,总算弄明 ... -
用JS访问操作iframe里的dom
2008-12-25 13:41 1679很多人一直都有个想法,要是可以随心所欲的操作iframe就好了 ... -
js飞舞
2008-12-23 15:32 932javascript:R=0; x1=.1; y1=.05; ... -
javascript屏蔽F5刷新键
2008-11-25 13:21 2350<script language="Javas ... -
js 两种继承方法(call prototype)
2008-11-11 14:19 3176<SCRIPT LANGUAGE="JavaS ...
相关推荐
IE6.0、IE7.0 与FireFox CSS兼容的解决方法
JavaScript在IE和Firefox(火狐)的不兼容问题解决
CSS在firefox和ie下的兼容性问题,是最让网页设计师头痛的事。在IE下测试明明是正常的,到了火狐下就变样了。这样一来还得重新修改,最怕改好后在IE下又不兼容了。这里介绍一下css在火狐和ie下的兼容要点。
firefox下溢出部分省略号显示
解决IE6 IE7 Firefox中li兼容问题
在Firefox下直接调用IE浏览器(IETab这个插件).zip
Firefox IE Tab 火狐浏览器及调试器
Javascript的IE和Firefox(火狐)兼容性解决方案
IE和firefox 调试 javascript css html 插件 exe文件为IE的,另一个为firefox的 AJAX开发必备
滤镜问题-FireFox火狐浏览器与IE的对比分析
IE+Firefox浏览器下搭建EBS的Form环境,实现IE,Firefox下Form同时工作
在后台加上即可解决IE9,firefox下面的问题: HttpServletResponse response =ServletActionContext.getResponse(); response.setContentType("text/html");
IE6_0、IE7_0 与FireFox CSS兼容的解决方法(网上收集)
解决 IIS IE7 Firefox 需要用户名和密码?
在文本中大量区分网页在IE与 fireFox里面js的区别与不同的表现方式,与达到统一的解决方法
这里总结了所有ie与firefox的各种兼容问题及解决办法,所有用,想学css的朋友可以看下
解决IE6、IE7、IE8、Firefox兼容的两种方案
CSS Hack兼容大全,令网页能正常显示在IE5,IE5.5,IE6,IE7,Firefox,Opera,Safari等浏览器上
兼容firefox火狐、IE6IE7IE8加入收藏,设为首页代码
可以兼容火狐的溢出变省略号可以兼容火狐的溢出变省略号可以兼容火狐的溢出变省略号可以兼容火狐的溢出变省略号