Знаете ли вы, что может вызвать утечку памяти в JavaScript?

Знаете ли вы, что может вызвать утечку памяти в JavaScript? Меня интересуют браузеры: IE 7, FireFox 3, Safari 3

Ответ 1

Есть хорошая статья о JavaScript и утечки памяти. В браузере это не относится конкретно, это скорее описывает всю проблему утечек памяти и JavaScript.

Я думаю, что это лучший подход как неспецифический браузер, насколько это возможно, для оптимизации нескольких браузеров при разработке веб-сайта для общественности.

Ответ 2

Вот классическая утечка памяти в IE: -

function body_onload()
{
    var elem = document.getElementById('someElementId');
    // do stuff with elem
    elem.onclick = function() {
        //Some code that doesn't need the elem variable
    }
 }

После запуска этого кода существует циклическая ссылка, поскольку элемент имеет функцию, назначаемую своим событием onclick, которое ссылается на объект области видимости, который, в свою очередь, содержит ссылку на элемент.

someElement- > onclick- > функция-scope- > elem- > someElement

В элементах IE DOM используются объекты подсчета ссылок на основе COM, которые Javascript GC не может очистить.

Добавление окончательной строки в вышеприведенный код очистит ее: -

var elem = null;

Ответ 3

В общем; циркулярные ссылки являются причиной многих проблем. Я помню IE 6 (не уверен, относится ли это к 7), очень плохо протекая с XMLHTTP... установка onreadystatechange = null, как только она была закончена с исправлением.

Ответ 4

Вы имеете дело с 2 видами объектов (и 2 сборщиками мусора), javascript и объектами DOM, которые могут ссылаться друг на друга (круговая ссылка), и тогда ни один GC не может заботиться обо всех своих объектах, даже если страница разгружается. Вот хорошее описание:

http://getben.com/archive/2006/05/30/Resolving-JavaScript-Memory-Leaks.aspx

http://www.josh-davis.org/2007/04/11/javascript-built-in-listeners-and-memory-leaks/