Как я могу помочь сборщику мусора в IE? - PullRequest
3 голосов
/ 21 августа 2011

У меня есть приложение JavaScript, которое использует XMLHttpRequest для получения и анализа около 60 000 документов XML.Тем не менее, использование памяти IE быстро растет, и в конечном итоге программа падает.Я подозреваю, что это связано с IE JScript GC.Ниже приведена упрощенная версия моего кода:

Над кодом я объявляю две переменные:

var xmlhttp;
var xmlDoc;

Когда код запускается впервые, я устанавливаю значение xmlhttp:

xmlhttp = new XMLHttpRequest();

Затем сценарий входит в основной цикл:

function loadXML() {

    xmlhttp.abort(); 
    xmlhttp.open("GET", url, false);
    xmlhttp.setRequestHeader('Content-Type', 'text/xml', 'Pragma', 'no-cache');
    xmlhttp.send("");
    while (xmlhttp.readyState != 4) { }
    xmlDoc = xmlhttp.responseXML;
    setTimeout("readXML()",0);

}


function readXML() {

    //Reads the XML.
    //If all data has been retrieved, exit loop.
    //Else, change the url and go back to loadXML()

}

Google Chrome прекрасно выполняет код без ошибок.Тем не менее, IE зацикливается около 2000 раз, прежде чем вылетает с ошибкой «Недостаточно памяти».Сборщик мусора не выполняет свою работу?Могу ли я переписать свой код для предотвращения проблем?

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Вам вообще не следует использовать занятый цикл для ожидания результата запроса XMLHttpRequest.Кроме того, нет никаких причин делать объект xmlhttp публичным.Вместо этого создайте новый при каждом вызове и зарегистрируйте обратный вызов:

function loadXML() {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", url, false);
    xmlhttp.setRequestHeader('Content-Type', 'text/xml', 'Pragma', 'no-cache');
    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState == 4) {
        xmlDoc = xmlhttp.responseXML;
        readXML();
      }
   };
   xmlhttp.send("");
}
1 голос
/ 21 августа 2011

Вы обязательно должны следовать советам phihag относительно лучшего способа обработки запросов xml и ждать их выполнения.

Тогда я бы предложил обнулить ваш старый объект xmlhttp и создать новый для каждого последующего запроса, чтобы каждый старый запрос мог быть полностью освобожден:

Вы не показываете нам, как вы выполняете одну и ту же вещь 60000 раз, поэтому я не могу помочь с подробностями этого кода, но если сам объект xmlhttp теряет часть памяти при каждом запросе xmlhttp, то уберите старый объект и создайте новый каждый раз.

Мы также не видим, что вы делаете в readXML, что может быть утечка, или что вы делаете в коде, который зацикливается и получает следующий запрос. У вас могут быть утечки функций, у вас могут быть круглые ссылки на объекты и т. Д. *

...