我的web应用程序一直在泄漏内存,所以我创建了一个测试网页,看看是否可以找出真正泄漏的是什么。所以我已经得到了这段简单的代码,它可以很快地增加到大约300mb的内存使用量。
在Chrome中,同样的代码似乎不会泄漏,因为一旦GC运行,内存使用率就会显着下降。在FF4 (Windows7)中,内存使用量似乎永远不会下降,即使代码已经运行完毕。
是什么导致了这里的内存泄漏,或者是FF4问题(我有noticed a few)?
注:我使用的是jQuery 1.5,在安全模式下运行时禁用了所有插件。
$.ajaxSetup ({
cache: false
});
var counter = 0;
ajaxTest();
function ajaxTest()
{
$.ajax({
type: "GET",
url: "/web/data/data.xml",
dataType: "xml",
success: function(xml) {
$("#counter").text(++counter);
xml = null;
if (counter < 2000)
setTimeout(ajaxTest,25);
}});
}发布于 2011-05-06 14:51:20
此反模式:
function bar()
{
function foo() { setTimeout(bar,25); }
setTimeout(foo,1);
}被称为“俄罗斯轮盘赌”。在每次迭代中,创建新的递归闭包。从技术上讲,这不是泄漏,而是内存中手工生成的递归结构。
发布于 2011-04-07 17:00:22
在回调函数的末尾,您可以只调用ajaxTest而不使用setTimeout。你到底为什么需要setTimeout?
发布于 2011-05-06 14:37:24
这可能是因为cache设置为false。它并不会真正阻止您的浏览器缓存响应;它只是唯一地发送每个请求,因此不会尝试使用缓存的响应。也许Chrome能更好地处理无用的缓存文件。我不太了解浏览器缓存是如何工作的,但是两千份相同的xml文件可能会占用大量内存。
也许你可以在启用缓存的情况下尝试一下,看看结果是否不同。
编辑:实际上,这可能是错误的。你应该看看http://blog.linkibol.com/2010/05/07/did-you-know-that-jquery-leaks-memory-like-a-fountain/
我不太确定为什么Chrome会被排除在这个问题之外…
https://stackoverflow.com/questions/5578448
复制相似问题