私は以前使っていた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ツリーはおそらく適切にクリーニングされていません。もし誰かが私を助けることができたら、それはすばらしいだろう。
なぜrequest.abort()を実行しますか? –
私はそれが絶対に必要ではないと思う、私はちょうどコピーし、タイムアウトコードからそれを貼り付け、それは問題を引き起こさない。 – user535617
jQueryを使うべきです。 :) – ChaosPandion