Chaque traitement ProcessingPayments() a utilisé une augmentation de la mémoire. CollectGarbage() n'aide pas. Utilisez Drip pour afficher l'utilisation de la mémoire, mais ne pas afficher les fuites DOM. Je n'utilise que IE8 et testé sur des versions plus anciennes. Les autres navigateurs ne sont pas intéressés.La mémoire fuit dans IE JS pendant les requêtes XMLHTTP
Comment puis-je diminuer l'utilisation croissante de la mémoire pendant l'exécution de ce script?
<!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>
Devez-vous également prendre en charge IE 6? Si non, pourquoi ne pas utiliser 'XMLHttpRequest' natif au lieu d'utiliser des objets ActiveX? Peut-être que cela résout votre problème. –
2Mercel Korpel: Je ne peux pas essayer d'utiliser XMLHttpRequest, parce que j'obtiens un message d'erreur "accès refusé" (requête interdomaine, car ce code HTML est basé sur l'ordinateur local et l'URL située sur facebook). Tous les paramètres pour éviter cette erreur ont été créés, mais avec XMLHttpRequest intégré ne fonctionne pas. – plr