IE内存泄露小结
2008-01-23 20:57
183 查看
师姐安排我做一个很简单,但是很麻烦的工作,检测IE内存泄露,内存泄露的方式不是很多,但是要真正查找到错误源不是很容易。
检测内存泄露的时候,使用的工具是drip0.5,在检测泄露的时候,有个很令人气愤的事情,在我的t41上检测不出来,但在t61上报
了好多错,令我很尴尬!
经过检测,现总结经验如下:
1:最容易检查的错误是类似于new了一个对象后,未delete该对象。js中最多出现的是,creatElement()
如:
var toolFlag=document.createElement("IMG");
toolFlag.id="ToolFlag";
toolFlag.src="images/move.gif";
toolFlag.style.position="absolute";
toolFlag.style.zIndex="1000";
toolFlag.style.display = "block";
toolFlag.style.left = "-100px";
toolFlag.style.top = "-100px";
document.body.appendChild(toolFlag);
//释放资源
toolFlag = null;
//如果不释放的话,drip就会检测到泄露
2:如果new的对象是一个全局的变量,那释放的时候将很复杂
如:
window.arr = new Array();
这个window.arr可能很多地方使用,而且可能在程序运行期间,还有用,所以我自己认为最好实在页面退出前释放,
在new对象的地方添加一个释放函数,然后可以在主框架<body>中添加 onunload 函数来调用那个释放的函数,
3:AJAX中新建的请求对象最好在请求完后释放,如果不释放的话,每次ajax请求都会重新生成一个对象,内存将会增长很快。
当然释放对象必须是在该ajax完成后(无论成功或者失败)
如:
//add by xcl
function AJAXRequest(method,url,data,callback)
{
var xmlHttp ;
if(window.XMLHttpRequest)
xmlHttp = new XMLHttpRequest() ;
else if(window.ActiveXObject)
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") ;
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status ==200){
var resStr ;
if(xmlHttp.responseXML != null && xmlHttp.responseXML.xml != null && xmlHttp.responseXML.xml != '')
resStr = xmlHttp.responseXML ;
else
resStr = xmlHttp.responseText ;
callback(resStr);
}
//释放ajax对象,
xmlHttp = null;
}
}
if(url.indexOf("?")>0)
url += "&random =" +Math.random() ;
else
url += "?&random =" +Math.random() ;
xmlHttp.open(method, url, true);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("CharSet","gb2312");
xmlHttp.send(data);
}
//end
检测内存泄露的时候,使用的工具是drip0.5,在检测泄露的时候,有个很令人气愤的事情,在我的t41上检测不出来,但在t61上报
了好多错,令我很尴尬!
经过检测,现总结经验如下:
1:最容易检查的错误是类似于new了一个对象后,未delete该对象。js中最多出现的是,creatElement()
如:
var toolFlag=document.createElement("IMG");
toolFlag.id="ToolFlag";
toolFlag.src="images/move.gif";
toolFlag.style.position="absolute";
toolFlag.style.zIndex="1000";
toolFlag.style.display = "block";
toolFlag.style.left = "-100px";
toolFlag.style.top = "-100px";
document.body.appendChild(toolFlag);
//释放资源
toolFlag = null;
//如果不释放的话,drip就会检测到泄露
2:如果new的对象是一个全局的变量,那释放的时候将很复杂
如:
window.arr = new Array();
这个window.arr可能很多地方使用,而且可能在程序运行期间,还有用,所以我自己认为最好实在页面退出前释放,
在new对象的地方添加一个释放函数,然后可以在主框架<body>中添加 onunload 函数来调用那个释放的函数,
3:AJAX中新建的请求对象最好在请求完后释放,如果不释放的话,每次ajax请求都会重新生成一个对象,内存将会增长很快。
当然释放对象必须是在该ajax完成后(无论成功或者失败)
如:
//add by xcl
function AJAXRequest(method,url,data,callback)
{
var xmlHttp ;
if(window.XMLHttpRequest)
xmlHttp = new XMLHttpRequest() ;
else if(window.ActiveXObject)
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") ;
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4) {
if(xmlHttp.status ==200){
var resStr ;
if(xmlHttp.responseXML != null && xmlHttp.responseXML.xml != null && xmlHttp.responseXML.xml != '')
resStr = xmlHttp.responseXML ;
else
resStr = xmlHttp.responseText ;
callback(resStr);
}
//释放ajax对象,
xmlHttp = null;
}
}
if(url.indexOf("?")>0)
url += "&random =" +Math.random() ;
else
url += "?&random =" +Math.random() ;
xmlHttp.open(method, url, true);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("CharSet","gb2312");
xmlHttp.send(data);
}
//end
相关文章推荐
- IE 内存泄露问题
- IE中的内存泄露【转载】
- 使用Chrome Profiles排查Web App的JS内存泄露小结
- C++中内存泄露小结
- Javascript 闭包引起的IE内存泄露分析
- JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
- IE内存泄露问题
- windows Xp IE内存泄露,IE重复打开窗口后,窗口白屏, 速度变慢解决办法
- android 内存泄露 小结
- IE Sieve && Leak finder js 内存的泄露
- js闭包和ie内存泄露原理
- IE内存泄露,iframe内存泄露造成的原因和解决方案
- 安卓内存泄露小结
- 说说JS在IE中的内存泄露问题
- asp.net使用Ajax+jquery+定时器,在IE(8--9)中导致内存无限增长,内存泄露
- [转]理解并解决IE内存泄露
- [转]IE 内存泄露问题
- IE内存泄露监测工具sIEve
- JS魔法堂:再识IE的内存泄露
- Javascript 闭包引起的IE内存泄露分析