Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ИЕ неподетски жрет память, Беда! А у Gecko все впорядке. 
:(
    Опции темы
Иль
Дата 2.7.2005, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Маленький отчет по теории с так называемыми Closures и их проблемами по утечки памяти в ИЕ. Closures - мощью JS, позволяющая сохранять контент отработавшего метода/функции, для использования в другом (именно отработавшего до конца метода, тк в браузерах одна JS машина и пока не отработает вызывающая функция, не пойдет вторая (ИМХО), см пример 2).
Проблема в том, что если в циклическую ссылку попадет DOM или ActiveX объект, то в IE сборщик мусора не сможет уничтожить попавшие в кольцо ссылок объекты. Память под них останется занятой до перезагрузки IE
Код

//1
function zz(a){//вот оно!!! Класический пример с Closures, который в ИЕ съедает памяти (а не должен)
var w=tt, ee=3// tt - id какой-то ноды
w.onclick=function(){alert(w+'\n'+ee)}//Сборщик мусора в ИЕ не справится с w, tt, анонимной функцией и вызывающей функцией (вроде так)
//+ так как получается кольцо ссылок с объектом DOM
}
//2
function zz(a){//порешим проблему обнулением w
var w=tt
w.onclick=function(){alert(w)}//увидим null
w=null//обнулили на выходе, но w никуда не пропадает и, надеюсь, хранится до смены или обновления страницы,
//+ что еще не факт, но вроде с этим мусорщик справляется :)
}
//3
function zz(a){// порешим проблему не присваивая ссылок на DOM объекты контенту вызывающей функции (переменной)
tt.onclick=function(){alert(123)}//не задавать никаких переменных. Тоже неплохой обман
}

Важно понимать, что во всех трех случаях мы полностью сохранили в памяти весь контент вызывающей функции для вложенной и если даже мы не передали явно в анонимную вложенную функцию какую-либо переменную вызывающей функции, то она всеравно остается нам доступной!!!
Также проблему можно полностью порешить применяя альтернативную форму описания метода обработчика события, но тогда ни какой контент не передасться.
Код

//4
function zz(a){
var w=tt// передадим переменной функции ссылку на объект ДОМ (tt - id элемента страницы)
w.onclick=new Function("alert(w)")// Это выдаст undefined, w не передалась. Обратите внимание, что здечь Function
//+ пишется с прописной буквы (загловной)
}

Наши иностранные друзья колбасятся не подетски и даже применяют сборщик информации по заданным обработчикам событий, чтобы по window.unload запустить в итерации (пордон, в цикле) их обнуление, типа ggg.onerror=null

Теперь другой вариант с простой циклической ссылкий с участием объекта DOM, что делает такую связку также недоступной для сборщика мусора, в отличии от циклической ссылки просто JS объектов.
Код

var gg=documentGetElementById("vv")
gg.im=new Image()
gg.im.parent=gg//сие дело надо присекать на корню и после использования этой ссылки делать gg.im.parent=null
//или можно заморочится с id или именами объектов


Лишним smile будет знать, что в ИЕ кнопка "Обновить" имеет память кликов (см в соседнем топике про это гадство).

Вы спросите, это все? Нет, не все, надо бы еще кой чего написать, но сил моих пока больше нет smile рыться в грязном белье ИЕ, хотя было интересно английские статьи читать. Даже и не знал, что пойму (видете как приспичело), спасибо злющей деканше иностранной кафедры.

Это сообщение отредактировал(а) Иль - 2.7.2005, 19:32


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 2.7.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата(Sardar @ 2.7.2005, 00:24)
взбуродажил народ и успокоил, всё таки non-stop приложения под ИЕ писать будем

Можно в двух словах, что да как. Все таки ты был прав и беспокоиться не нужно?
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 2.7.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Вообще беспокоится нужно. Выборка из иследований одного человека это мало. Конечно хорошо если MS все предусмотрел, но про это никто не говорит. Если ИЕ проглючит на MAC, то и бог с ним, но ведь non-stop вещи обычно пишутся на корпоротивного пользователя и под Windows, представляеш если там проглючит? Я б задал вопрос на заграничном форуме, но боюсь там долго будут смеяться над моим английским smile

Я пока в пост выше теории добавлю


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 29.12.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Closures по русски называют замыканиями. Известны они также в PERL


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 29.12.2005, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Проблема жуткая, JS силён своими closures (хотя круче наверное только Ruby), но ИЕ как это часто бывает всё в *овно переведёт... Читаем вторую ссылку с первого поста Иль, там решение проблемы. Вещь актуальная для тех кто генерит много инфы с помощью JS на клиенте, у нас так меню тормозило... жаль когда подрубают прямо под ноги... smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1267 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.