使用XMLHttpRequest和setInterval进行内存泄漏

时间:2012-03-21 13:59:25

标签: javascript google-chrome xmlhttprequest setinterval v8

以下是我在Google Chrome 19.0.1061.1(官方版125213)开发的代码:

<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://任务中的内存使用情况时,我可以看到&#34;私有内存&#34;无限期地成长(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有关吗?

我很感激你对它的见解。

3 个答案:

答案 0 :(得分:8)

在第一个中,您将在每次调用迭代器函数时实例化一个新的XMLHttpRequest对象。请求对象将至少存在,直到HTTP请求完成。每秒启动200个HTTP请求会阻塞浏览器,因为它实际上不会执行所有请求;它将打开多少并发连接是有限制的。

答案 1 :(得分:1)

此http呼叫需要多长时间?如果这花费的时间超过50毫秒(这是一个非常快的时间),那么第一种情况将创建越来越多的待处理请求,而第二种情况则是重新使用相同的XMLHttpRequest,这可能会取消之前的调用。

答案 2 :(得分:0)

在第一个示例中,您将使用每个间隔调用XMLHttpRequest()的新实例。在第二个中,您实例化一次副本并在代码的整个生命周期中使用它。这就是为什么在第一个例子中你的内存不足。