这是我在 Google Chrome 19.0.1061.1(官方内部版本 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 中的内存使用情况时,我可以看到“私有(private)内存”正在无限增长(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 有关吗?
非常感谢您对此的见解。
最佳答案
在第一个中,您在每次调用迭代器函数时实例化一个新的 XMLHttpRequest 对象。请求对象将至少保留到 HTTP 请求完成为止。每秒启动 200 个 HTTP 请求会严重阻塞浏览器,因为它实际上不会执行所有请求;它打开的并发连接数是有限制的。
关于javascript - XMLHttpRequest 和 setInterval 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806115/