Pull to refresh

Простой, казалось бы, вопрос по JavaScript

Reading time1 min
Views5.3K
Есть простейший с виду код:

setInterval(function(){
     var xhr = new XMLHttpRequest();
     xhr.open('GET', 'json.txt', true);
     xhr.onreadystatechange = function() {
        if(this.readyState == 4 && this.status == 200) {
           console.log(this.responseText);
        }
     };
     xhr.send('');
}, 500);


Если оставить этот код работающим в, например, Google Chorme, скажем, на 1 час, он съедает память. Съедает методично. Если посмотреть в Developer Tools на профиль использования памяти видно что память таки чистится GC но не до конца. Со временем минимальная точка на графике после GC растет.

image

Аналогично рост потребления памяти видно и по about:memory. «Отжир» памяти стабильно видно и в FF…

Важное...
  • Файл json.txt лежит на localhost, его загрузка не занимает более 500мс гарантированно (я проверял).
  • Вывод в консоль я тоже отключал — память по прежнему отжирается.
  • EDIT без включенных developer tools — тоже течет, видно на about:memory.


Кроме этого кода более на данной странице никакого кода нет вообще.

Возможно я не понимаю как работает GC в JS, но по моему понятию тут нечему течь и нечему жить вечно. Может кто-то объяснить почему?

P.S. «Настоящей» утечки таки нет, если обновить страницу — память очищается.
P.P.S. Есть локальная жизненна потребность («требования бизнеса») оставлять подобный по структуре код на гораздо большие промежутки чем 1 час.

UPD: Оказывается есть даже тикет в хромиуме: code.google.com/p/chromium/issues/detail?id=52411
UPD: Якобы fixed in 9, но я проверяю на 10.
Tags:
Hubs:
+39
Comments91

Articles