Javascript responseXML утечка памяти - PullRequest
1 голос
/ 28 января 2011

Я обнаружил некоторые утечки памяти в файле Javascript, с которым работал, и обнаружил одного из последних виновников пересоединения.Когда я получаю responseXML из XMLHttpRequest, я не думаю, что ответ когда-либо будет удален.Я не знаю, как удалить его, я попытался удалить дочерние узлы, а затем установить его на ноль (надежная сборка мусора будет работать), и я также попытался использовать ключевое слово delete.Ничто из этого не помогло.Ниже приведен фрагмент кода, который нарушает работу (я пропустил некоторые тайм-ауты, которые удаляют сам запрос, но это не является причиной утечки памяти).

var request = new XMLHttpRequest();
request.open("GET", url, true);
request.onreadystatechange = onReadyStateChange1;
request.send();
}

function onReadyStateChange1()
{
    if (4 == request.readyState)
    {
        if (request.status == 200)
        {
            request.responseXML;     //It leaks even if I just do this.
            //me.ParseData(request.responseXML);
            me.disconnected = 0;
        } else
        {
            me.disconnected += 1;
        }
        request.onreadystatechange = noop;    //noop is an empty function
        request = null;
        me = null;
    }
}

Как вы можете видеть в коде, я недаже не вызывая ParseData, я просто положил request.responseXML;, и он все еще протекаетЕсли я прокомментирую и эту строку, утечка исчезла.Это означает, что утечка не в функции ParseData или где-либо еще, это - responseXML.Я считаю, что это связано с древовидной структурой responseXML, дерево DOM, вероятно, не очищается должным образом.Если бы кто-нибудь мог мне помочь, это было бы здорово.

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

responseXML, который возвращает IE, на самом деле представляет собой MSXML DOM вместо MSHTML DOM, поэтому разработчики могут использовать функции selectNodes и selectSingleNode.MSXML DOM имеет собственный механизм сборки мусора , так что вы не заметите, что свободная память сразу после выхода DOM из области видимости.Поэтому я бы сказал, что это, вероятно, не настоящая утечка памяти, а свободная задержка.

0 голосов
/ 29 января 2011

Если вы поместите обработчик ответа в качестве анонимной функции, имеющей такую ​​же область видимости, как:

var request = new XMLHttpRequest();
request.open("GET", url, true);
request.onreadystatechange = function(){
  if (4 == request.readyState){
    ...
  }
}

Он тоже протекает?

...