我遇到了jQuery.ajax()的内存泄漏问题。我已按照here和here的建议,但仍然看到内存泄漏。我本质上是在尝试用我自己的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。这似乎更糟糕。我已经尝试将成功处理程序放入其自己的函数中。没有帮助。
这是一个解释问题的方法 - http://jsfiddle.net/aADXq/7/
有任何建议吗?
THX。
答案 0 :(得分:0)
将ajax请求中的dataType更改为“text”,然后使用json_parse.js解析生成的字符串。这个库递归地解析json而不使用eval,这就是你的记忆。