我遇到了 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/
有什么建议吗?
谢谢。