我有一个简单的JavaScript代码,它在无限运行时消耗内存。内存消耗由Google内部内存分析器监控。
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);具有上述代码示例和json.txt的Html托管在我的本地服务器上,获取一个文件所花费的时间不超过500 is (总是7-10 is )。
在很长一段时间内,内存图是这样的。

工作一小时后,编辑相同的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。
发布于 2011-04-20 01:20:59
我想这个间隔不是在真空中设定的。要传递给setInterval的函数可以访问在其中定义的词法作用域。这意味着它周围的每个变量在垃圾收集器眼中都是可访问的,即使在函数中没有使用这些变量。垃圾收集器永远不会把它清理干净。在更卫生的环境中定义函数可能会更好,因为在这个环境中,函数将无法访问任何大小较大的变量。
编辑:对不起,我会尽量让自己更清楚。这与XHR无关--您可以在该setInterval函数中放置任何东西(甚至是任何东西),如果它的词法作用域中存在一些您希望清理的变量,它仍然会泄漏。您只需要确保setInterval函数没有对任何要清理的变量的闭包访问。例如:
(function() {
var a = readFile('a-very-big-file.txt');
setInterval(function() {
console.log('im leaking!');
}, 500);
})();会漏水的。尽管setInterval没有做任何特别有意义的事情,但它仍然可以访问"a",垃圾收集器认为它是可访问的。
发布于 2011-04-14 07:01:58
首先,您重复加载json.txt的内容,这将需要一些内存。除此之外,XHR本身也可能需要一些内存。不过,我不认为这有多大的问题,因为内存似乎被回收了。
发布于 2011-04-14 07:03:17
为什么不应该呢?至少var xhr =新的XMLHttpRequest();必须在每次迭代时消耗内存,并由GC收集(可能,在图表中可以看到)。
https://stackoverflow.com/questions/5659645
复制相似问题