我正在为 XML 发出 AJAX 请求。我每秒都在这样做。我注意到我的内存使用量增长到数百兆字节。正如您所想象的,客户对此并不满意。在各个地方阅读之后,我怀疑函数闭包让我头疼。我正在寻找可以进行的任何验证以及有关如何修复它的任何帮助。
function PageManager () {
var self = this;
self.timeoutHandler = function () {
$.ajax ({
url: 'URLtoXML',
type: 'post',
cache: false,
context: self,
success: function (data) {
var slf = this;
var xmlDoc = $($.parseXML (data));
xmlDoc.find ("tag_label").each (function () {
self.val = parseInt ($.trim ($(this).text ()));
}
setTimeout (slf.timeoutHandler, 750);
}
});
}
}
var pm = new PageManager ();
pm.timeoutHandler ();
编辑 我结合了一些人的想法和一些成功处理程序的内部结构。我看到增长率较小,但幅度不大。
最佳答案
为避免任何新创建的函数(上下文)在这里关闭其父作用域,您只需要在 setTimeout
中删除匿名函数。所以
setTimeout(self.timeoutHandler, 750);
然而,即使闭包会覆盖父上下文,任何半正经的垃圾收集器(就像任何现代浏览器一样)都会注意到它并在该方法触发后释放内存。您没有提到的非常重要的事情是您在哪个浏览器上注意到了这种行为。例如,Firefox 垃圾收集器的工作方式......非常难以预测(至少对我而言)。它将允许使用越来越多的内存,然后在某个时候,它会再次释放大量内存。
要查看发生了什么,请使用 Firefox 并在脚本运行时查看 about:memory
。
在那里你会看到内存的去向。如果内存使用量增加一段时间,我不会担心。看看它,如果这就是您的全部代码,那么内存迟早会被释放。
关于javascript - jQuery 内存泄漏怀疑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348182/