Знаете ли вы, что может вызвать утечку памяти в JavaScript? Меня интересуют браузеры: IE 7, FireFox 3, Safari 3
Знаете ли вы, что может вызвать утечку памяти в JavaScript?
Ответ 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/
Ответ 5
Вы можете проверить эту статью MSDN для шаблонов утечки памяти Internet Explorer. Также есть некоторые инструменты для обнаружения утечек памяти: