0

我遇到了 jQuery.ajax() 的内存泄漏。我已经按照这里这里的建议,但仍然看到内存泄漏。我实际上是在尝试用我自己的 API 替换 Google Visualization API,因为 GV 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。等等。最终,这将使浏览器崩溃。

我试过 setTimeout 而不是 setInterval。这似乎更糟。我已经尝试将成功处理程序放入它自己的函数中。没有帮助。

这是一个 jsfiddle 来说明问题 - http://jsfiddle.net/aADXq/7/

有什么建议吗?

谢谢。

4

1 回答 1

0

将 ajax 请求中的 dataType 更改为“text”,然后使用json_parse.js解析结果字符串解析结果字符串。这个库递归地解析 json 而不使用 eval ,这会占用你的内存。

于 2012-10-02T19:32:36.413 回答