jQuery.ajax() でメモリ リークが発生しています。私はこことここの提案に従いましたが、それでもメモリリークが見られます。GV APIもメモリリークするため、基本的にGoogle Visualization APIを独自のAPIに置き換えようとしています。これが私のコードのスニペットです:
RiseVision.Common.Visualization.Query = function(url) {
this.baseURL = url + "&tqx=responseHandler:setResponse";
this.url = this.baseURL;
}
RiseVision.Common.Visualization.Query.prototype.send = function(callback) {
var self = this;
this.callback = callback;
this.hasResponded = true;
this.timerID = setInterval(function() {
if (self.hasResponded) {
self.hasResponded = false;
self.sendQuery();
}
}, this.refreshInterval);
}
RiseVision.Common.Visualization.Query.prototype.sendQuery = function() {
var request = $.ajax({
url: this.url,
context: this,
jsonpCallback: "setResponse",
dataType: "jsonp",
success: function(json) {
var response = new RiseVision.Common.Visualization.QueryResponse(json);
if (json.sig != null) {
this.url = this.baseURL + ";sig:" + json.sig;
}
if ((response.getStatus() == "error") && (response.getReasons() == "not_modified")) {
}
else {
this.callback(response);
}
response = null;
this.hasResponded = true;
}
});
//This is supposed to mitigate the memory leak.
request.abort = null;
request = null;
}
jQuery 1.8 を使用しています。リアルタイム データを取得しているため、refreshInterval は 1 秒です。Chrome のタスク マネージャーに表示されるのは、メモリが徐々に増加していることです。約 5 分後、ガベージ コレクションが開始されたように見え、メモリが低下します。問題は、メモリが開始時と同じレベルまで低下していないことです。たとえば、メモリは 50K から始まり、徐々に 60K に増加し、その後ガベージ コレクションが開始され、メモリは 52K に減少します。現在は 62K に増加し、その後 54K に減少します。等々。最終的に、これはブラウザをクラッシュさせます。
setInterval の代わりに setTimeout を試しました。それはもっと悪いようです。成功ハンドラーを独自の関数に入れてみました。役に立ちませんでした。
問題を説明するためのjsfiddleは次のとおりです- http://jsfiddle.net/aADXq/7/
何か提案はありますか?
どうも。