Утечка памяти с XMLHttpRequest и setInterval - PullRequest
3 голосов
/ 21 марта 2012

Вот код, который я запускаю в 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: //, я вижу, что «Частная память»"растет бесконечно (8GB RAM config).Если я изменю пример кода выше на что-то вроде этого:

<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 ]

8 голосов
/ 21 марта 2012

В первом случае вы создаете новый объект XMLHttpRequest при каждом вызове функции итератора.Объекты запроса будут оставаться как минимум до тех пор, пока не завершатся HTTP-запросы.Инициирование 200 HTTP-запросов в секунду приведет к засорению браузера, поскольку он фактически не выполнит все запросы;есть ограничение на количество одновременных соединений, которые он открывает.

1 голос
/ 21 марта 2012

Сколько времени занимает этот http-вызов?если это займет больше времени, чем 50 мс (что очень мало времени), то в первом случае будет создаваться все больше и больше ожидающих запросов, а во втором случае вы снова используете тот же XMLHttpRequest, который может привести к отмене предыдущего вызова.

0 голосов
/ 21 марта 2012

В первом примере вы вызываете новый экземпляр XMLHttpRequest () с каждым интервалом.Во втором случае вы создаете копию экземпляра один раз и используете ее на протяжении всего жизненного цикла кода.Вот почему в первом примере вам не хватает памяти.

...