您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: