【发布时间】:2012-04-06 01:26:34
【问题描述】:
这是我在 Google Chrome 19.0.1061.1 (Official Build 125213) dev 上运行的一些代码:
<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://tasks 中检查内存使用情况时,我可以看到“私有内存”无限增长(8GB RAM 配置)。 如果我将上面的代码示例更改为:
<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 对象以防止其泄漏。注意:如果您尝试从服务器读取响应,这将中断,因为它将在 50 毫秒内被覆盖。
-
-为什么在作用域函数上使用调用? (function(context){console.log(context)/*window*/})(this); (function(context){console.log(context)/*window*/})(window); (function(){console.log(this)/*window*/})();
标签: javascript google-chrome xmlhttprequest setinterval v8