Есть простейший с виду код:
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 растет.
Аналогично рост потребления памяти видно и по 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.