Вызывают ли циклические ссылки утечки памяти в JavaScript?

#javascript #debugging #browser #memory-leaks #cross-browser

#javascript #отладка #браузер #утечки памяти #кроссбраузерность

Вопрос:

Я прочитал много заявлений о том, что циклические ссылки вызывают утечки памяти:

Итак, я протестировал этот скрипт в Chrome / FF4 / IE9 / Opera / Safari:

 <script>
var a, b, list = [];

for(var x=0;x<1000000;x =2){
    a = list[x] = document.createElement("div");
    b = list[x   1] = document.createElement("div");
    a.hook = b;
    b.hook = a;
}
</script>
  

Диспетчер задач показывает, что скрипт потребляет ~ 0,2 ГБ памяти.

Затем я обновил страницу 10 раз. Если скрипт действительно вызывает утечки памяти, после 10 обновлений я должен увидеть ~ 2 ГБ потребляемой памяти, однако диспетчер задач показывает обратное.

В каких браузерах циклические ссылки вызывают утечки памяти в JavaScript?

Комментарии:

1. auth0.com/blog/…

Ответ №1:

Утечки памяти были в основном проблемой в старых версиях с циклическими ссылками и сборкой мусора с подсчетом ссылок, которая никогда полностью не восстанавливала все (никогда количество ссылок в циклических ссылках не равнялось 0).

Я думаю, что утечки памяти в IE были исправлены с IE8.

У Microsoft есть подробная статья на эту тему.

Комментарии:

1. другими словами, как бы мы ни старались, утечки памяти javascript больше невозможны?

2. @Pacerier Ну, IE7 и IE6 все еще довольно распространены.

3. хорошо, позвольте мне перефразировать мой вопрос. итак, можем ли мы сказать, что утечки памяти на 100% больше невозможны в современных браузерах?

4. @Pacerier Я не уверен на 100%. Вы всегда можете взломать исходный код в своем любимом браузере с открытым исходным кодом и посмотреть, не освобождается ли какая-либо память при каких обстоятельствах.

5. @Pacerier, Microsoft устала от IE6; они понимают, что это довольно ужасно по современным стандартам, и хотят заставить людей перейти на более приятные, новые браузеры. Они не хотят прослыть ужасными браузерами только потому, что люди недавно не обновляли их…