Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Сборщик мусора в JavaScript (https://javascript.ru/forum/events/1405-sborshhik-musora-v-javascript.html)

no_alex 28.11.2008 03:55

Цитата:

И что этим кодом можно увидеть? Скачки в несколько килобайт используемой памяти, связаны с работой сборщика мусора. Не в одном браузере утечек памяти не наблюдается.
Именно в этом я и хотел убедится. У меня, пока тоже, аналогичный результат получился.

Цитата:

В памяти остаются все дочерние узлы, на которые где-либо хранятся ссылки
Это "особенность" наверное очень даже правильная! Раз я себе этот объект для чего-то "заначил" (читай: сохранил на него ссылку), значит мне он для чего-нибудь еще будет нужен. Следовательно удалять его можно только когда исчезнут все ссылки на него.

Другое дело, не произойдёт ли что-либо подобное, если на чилдрена есть не прямая ссылка, а подписка на событие. Мне сегодня уже лень это проверять - завтра попробую протестить.
Или если у кого-то будет еще желание этим заняться - бросьте сюда тестовый код.

no_alex 28.11.2008 04:08

Небольшой оффтопик, с Вашего позволения...

Цитата:

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

Или Вы в этом случае запрещаете кэширование? Тогда, ИМХО, его надо будет запрещать в 90% случаев. А в оставшихся 10% эффективность кэша будет близка к нулю.

Это по крайней мере было-бы так с теми задачами, которые мне приходилось решать.

Octane 28.11.2008 04:28

В документе не должно быть нескольких элементов с одним идентификатором. При смене идентификатора через специальную функцию, кэш очищается. Можно повесить обработчики, очищающие кэш, на специальные события, реагирующие на изменения структуры DOM, но я этого пока не делал, потому что в ИЕ нет этих событий. Повышение производительности при использование кэша существенно, поэтому стоит заморачиваться, темболее операции, требующие очистки кэша встречаются не так часто в большинстве скриптов.

vk65535 28.11.2008 19:37

Цитата:

Сообщение от Gvozd (Сообщение 8903)
ну, если вас так интересует этот вопрос, то составьте сркипт, с созданием больших объектов(чтоб утечка памяти на глаз была заметна), слушателячми и прочим, и последующим удалением
выложите его тут, пускай в разных протестят, и оформят здесь результаты.
а мне влом писать скрипт, я пошел спать.
всем спокойной ночи

Протестить можно, допустим, так:
Код:

for (var i = 0,
        efn = window.addEventListener ? 'addEventListener' : 'attachEvent',
        et = (window.addEventListener ? '' : 'on') + 'click',
        e; i < 100000; ++i
)
        (e = document.createElement('DIV'))[efn](et, function(e){ return function(){}; }(e), false);

Лиса вначале ест память, потом, если дать ей немного остыть - отдает.
Опера-9 довольно быстро и корректно отрабатывает сборку мусора, отъем памяти почти незаметен.
Осел, ест, но, как и ожидалось, не отдает. Если убрать циклическую ссылку из замыкания (выделена жирным), то, осел вообще не ест память (либо отдает слишком быстро). Если свернуть окно осла, память освобождается, но если потом опять развернуть и еще разок прогнать цикл - достает всю кучу мусора из свопа и продолжает ее наполнять )
Сафаря-3, память отдавать не торопится - или это похожий баг, или там уборщик мусора ленивый )

Gvozd 04.12.2008 23:58

vk65535, Большое спасибо, за тесты


Часовой пояс GMT +3, время: 13:32.