【发布时间】:2011-04-14 06:56:18
【问题描述】:
我有一个简单的 JavaScript 代码,它在无限运行时会消耗内存。内存消耗由 Google Chrome 内部内存分析器监控。
setInterval(function(){
var xhr = new XMLHttpRequest();
xhr.open('GET', 'json.txt', true);
xhr.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
xhr.send('');
}, 500);
带有上述代码示例的 HTML 文件和 json.txt 托管在我的本地服务器上,获取文件的时间不超过 500 毫秒(通常约为 7-10 毫秒)。
长时间运行内存图是这样的
编辑工作一小时后的同一个 Chrome 窗口
编辑 从长远来看(小时),并非所有内存都被回收,图表仍在上升。 我了解为什么内存被消耗,我不明白为什么它没有完全回收。
编辑 这就是我可以减少内存泄漏的方法
var callback = function(){
if(this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
}
setInterval(function(){
var xhr = new XMLHttpRequest();
xhr.open('GET', 'json.txt', true);
xhr.onreadystatechange = callback;
xhr.send('');
}, 500);
这项改进允许不将回调的闭包链接到xhr var。
【问题讨论】:
-
你能用接受的答案修复你的泄漏吗?
-
@brainjam,接受的答案给了我线索,如何改进这段代码。查看我的编辑。
-
我的大脑很痛。我猜您最初的构造是在匿名函数和闭包之间创建循环引用。这是一个非常微妙的(无论如何对我来说)内存泄漏模式的很好的例子。感谢您的坚持,直到您得到一个好的答案。
标签: javascript garbage-collection xmlhttprequest