Javascript responseXML内存泄漏

时间:2011-01-28 18:54:35

标签: javascript memory-leaks tree xmlhttprequest

我一直在追踪我一直在使用的Javascript文件中的一些内存泄漏,而且我发现了最后一个重复的罪魁祸首之一。当我从XMLHttpRequest获取responseXML时,我不认为响应会被删除。我不知道如何删除它,我尝试删除子节点,然后将其设置为null(希望垃圾收集工作),我也尝试使用删除关键字。这些事情似乎都没有帮助。下面是一些有问题的代码(我省略了一些删除请求本身的超时内容,但这不是导致内存泄漏的原因)。

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 个答案:

答案 0 :(得分:1)

IE返回的responseXML实际上是MSXML DOM而不是MSHTML DOM,因此开发人员可以使用selectNodes和selectSingleNode函数。 MSXML DOM有自己的garbage collection mechanism,所以在DOM超出范围之后你就不会注意到内存空闲。因此,我会说这可能不是真正的内存泄漏,而是无延迟。

答案 1 :(得分:0)

如果您将响应处理程序作为匿名函数共享相同的范围,如:

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

它也会泄漏吗?