每个ProcessingPayments()使用的内存增加。 CollectGarbage()没有帮助。使用滴水查看内存使用情况,但不要查看任何DOM泄漏。IE JS内存泄漏,而XMLHTTP请求
我只使用IE8并在旧版本上测试。其他浏览器不感兴趣。
如何在执行此脚本时减少增长的内存使用量?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JS IE XMLHTTP - Memory leaks</title>
</head>
<body onload="ProcessingPayments();locCollectGarbage();">
<script language="JScript">
var toProcessingPayments;
var ProcessingPaymentsPeriod = 1*60*1000;
var SessionCount = 1;
var CollectGarbageCount = 1;
function ProcessPayment(arrParams) {
var e;
var strURL = "http://www.facebook.com/";
var strURLParam = "";
try { var locHTTPRequest = new ActiveXObject("MSXML2.XMLHTTP.6.0"); }
catch (e) { var locHTTPRequest = new ActiveXObject("MSXML2.XMLHTTP"); }
function ProcessPaymentHTTPRequest() {
if (locHTTPRequest.readyState != 4) {
return;
}
if (locHTTPRequest.status != 200) {
document.getElementById("CurrentSession").innerHTML = document.getElementById("CurrentSession").innerHTML
+arrParams.i+" = error code "+locHTTPRequest.status+"<br />";
return false;
}
if (locHTTPRequest.getResponseHeader("Content-Type").indexOf("text/html") < 0) {
document.getElementById("CurrentSession").innerHTML = document.getElementById("CurrentSession").innerHTML
+arrParams.i+" = wrong content type "+locHTTPRequest.getResponseHeader("Content-Type").indexOf("text/html")+"<br />";
return false;
}
try {
document.getElementById("CurrentSession").innerHTML = document.getElementById("CurrentSession").innerHTML
+arrParams.i+" = processed<br />";
return true;
}
catch(e) {
if (locHTTPRequest.responseXML.parseError != 0) {
return false;
}
else {
return false;
}
}
locHTTPRequest.abort();
delete locHTTPRequest["onreadystatechange"];
locHTTPRequest = null;
} // function ProcessPaymentHTTPRequest()
strURLParam = "?"+arrParams.i;
locHTTPRequest.open("get", strURL+strURLParam);
document.getElementById("CurrentSession").innerHTML = document.getElementById("CurrentSession").innerHTML
+arrParams.i+" = request<br />";
locHTTPRequest.onreadystatechange = ProcessPaymentHTTPRequest;
locHTTPRequest.send(null);
}
function ProcessingPayments(arrPayment) {
var e;
toProcessingPayments = null;
document.getElementById("CurrentSession").innerHTML = "";
for (var i = 0; i < 10; i++) {
ProcessPayment({
i: i
});
}
SessionCount++;
document.getElementById("Session").innerText = SessionCount;
toProcessingPayments = setTimeout(ProcessingPayments, ProcessingPaymentsPeriod);
}
function locCollectGarbage() {
CollectGarbage();
document.getElementById("CollectGarbage").innerText = CollectGarbageCount;
CollectGarbageCount++;
setTimeout(locCollectGarbage, 5*60*1000);
}
</script>
</body>
<p>Sessions: <span id="Session">0</span></p>
<p>CollectGarbage(): <span id="CollectGarbage">0</span></p>
<hr />
<br />
<p>Current session:</p>
<p id="CurrentSession"></p>
</html>
您是否需要支持IE 6?如果没有,为什么不使用本地'XMLHttpRequest'而不是使用ActiveX对象?也许这解决了你的问题。 – 2010-09-04 17:00:59
2Mercel Korpel:我无法尝试使用XMLHttpRequest,因为我收到一条错误消息“访问被拒绝”(跨域请求,因为这个HTML基于本地计算机和URL位于facebook)。 所有设置,以防止这个错误,但内置XMLHttpRequest不起作用。 – plr 2010-09-04 19:45:45