2011-01-28 52 views
1

我一直在跟踪我一直在使用的JavaScript文件中的一些内存泄漏,并且我发现了最后一个残缺的元凶之一。当我从XMLHttpRequest获取responseXML时,我认为这个响应不会被删除。我不知道如何删除它,我试图删除子节点,然后将其设置为空(希望垃圾收集工作),我也尝试使用删除关键字。这些东西似乎都没有帮助。下面是一些有问题的代码(我省略了一些超时的东西,它自己删除了请求,但这不是导致内存泄漏的原因)。Javascript的响应XML内存泄漏

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树可能没有正确清理。如果任何人都可以帮助我,那会很棒。

+0

你为什么要做request.abort()? – 2011-01-28 19:07:59

+0

我想这不是绝对必要的,我只是复制并从超时代码粘贴它,并没有造成任何问题。 – user535617 2011-01-28 19:15:58

回答

1

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

0

如果你把响应处理作为一个匿名函数一样共享相同的范围内:

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

是否泄漏呢?