下面是一些代码,我在谷歌的Chrome 19.0.1061.1运行(正式版本125213)开发:内存泄漏一个XMLHttpRequest和setInterval
<html>
<title>Memory Leak</title>
<script type="text/javascript">
(function(){
this.window.setInterval(function() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '', false);
xhr.send();
}, 50);
}).call(this);
</script>
</html>
当我在Chrome检查内存使用://任务,我可以看到“私人内存”无限增长(8GB内存配置)。 如果我的代码示例更改上面类似的东西:
<html>
<title>Memory Leak</title>
<script type="text/javascript">
(function(){
var xhr = new XMLHttpRequest();
var timeout = this.window.setInterval(function() {
xhr.open('GET', '', false);
xhr.send();
}, 50);
}).call(this);
</script>
</html>
它现在确定。
我不明白。 为什么保持对setInterval函数的引用有帮助,而为什么定义只有一个xhr有帮助,因为前面的声明是在闭包中?它仅与v8有关吗?
我将不胜感激您的见解。
保持对超时的引用并不能帮助清理泄漏。它重新使用XHR对象,防止泄漏。注意:如果您尝试从服务器读取响应,则会在50ms内被覆盖,因此会中断响应。 – 2012-03-21 14:06:58
- 为什么在范围函数上使用调用? (function(context){console.log(context)/ * window * /})(this); (function)(context){console.log(context)/ * window * /})(window); (function(){console.log(this)/ * window * /})(); – elmuchacho 2012-03-21 14:44:49