2011-01-28 109 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){ 
    ... 
    } 
} 

是否泄漏呢?