2011-01-28 5 views
1

私は以前使っていたJavascriptファイルでいくつかのメモリリークを追跡していましたが、私は最後のリミニングの犯人の1つを見つけました。私がXMLHttpRequestからresponseXMLを取得したとき、私は応答が削除されるとは思わない。私はそれを削除する方法を知らない、私は子ノードを削除し、nullに設定して(ガーベジコレクションが動作することを望んで)、私はまた削除キーワードを使用してみました。これらのことのどちらも役に立たなかったようです。以下は問題のコードの一部です(リクエスト自体を削除するいくつかのタイムアウトを省略しましたが、これはメモリリークの原因とはなりません)。Javascript responseXMLメモリリーク

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; 
    } 
} 

あなたがコード内で見ることができるように、私も、私はちょうどrequest.responseXML;を入れて、それはまだリークし、ParseDataを呼び出すことはありません。もし私がその行をコメントアウトしても、漏れはなくなりました。 ParseData関数や他の場所にリークがないことを意味するのは、responseXMLです。私はそれがresponseXMLのツリー構造と関係していると考えていますが、DOMツリーはおそらく適切にクリーニングされていません。もし誰かが私を助けることができたら、それはすばらしいだろう。

+0

なぜrequest.abort()を実行しますか? –

+0

私はそれが絶対に必要ではないと思う、私はちょうどコピーし、タイムアウトコードからそれを貼り付け、それは問題を引き起こさない。 – user535617

+2

jQueryを使うべきです。 :) – ChaosPandion

答えて

1

IEが返すresponseXMLは、実際にMSHTML DOMではなくMSXML 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){ 
    ... 
    } 
} 

それはあまりにも漏れていますか?

+0

はい、それは私が質問に記載したように、私はほぼ100%の問題は、responseXMLを得ることであると確信しています。 – user535617

+0

それは変です。私は上記のコードをリークなしで何年も使用してきました。別の簡単なXMLを試しましたか? – Mic

関連する問題