0

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/

何か提案はありますか?

どうも。

4

1 に答える 1

0

ajaxリクエストのdataTypeを「text」に変更してから、結果の文字列をjson_parse.jsで解析します。このライブラリは、メモリを消費しているevalを使用せずに、jsonを再帰的に解析します。

于 2012-10-02T19:32:36.413 に答える