Утечки памяти JavaScript после разгрузки веб-страницы

Другой вариант - использовать «Модули среды» ( http://modules.sourceforge.net/ ). Это, к сожалению, вводит третий язык в смесь. Вы определяете среду с помощью языка Tcl, но есть несколько удобных команд для типичных модификаций (prepend vs. append vs set). Вам также необходимо установить модули среды. Затем вы можете использовать module load *XXX*, чтобы назвать желаемую среду. Команда модуля - это в основном причудливый псевдоним для механизма eval, описанного выше Томасом Каммейером. Основным преимуществом здесь является то, что вы можете поддерживать среду на одном языке и полагаться на «Модули среды», чтобы преобразовать ее в sh, ksh, bash, csh, tcsh, zsh, python (?!? !!) и т. Д.

8
задан ykaganovich 3 July 2009 в 05:06
поделиться

3 ответа

Вот в чем проблема. IE имеет отдельный сборщик мусора для DOM и для javascript. Они не могут обнаружить циклические ссылки между ними.

Мы привыкли очищать все обработчики событий со всех узлов при выгрузке страницы. Однако это может остановить браузер во время выгрузки. Это касается только случая, когда циклическая ссылка была вызвана обработчиками событий. Это также могло быть вызвано добавлением прямых ссылок из узлов DOM на объекты js, которые имели ссылку на сам узел DOM.

Еще одна хорошая вещь, которую следует помнить, - это то, что если вы удаляете узлы, рекомендуется удалить обработчики самостоятельно первый. Ext-js имеет метод Ext.destroy, который делает именно это (если вы установили обработчики с помощью ext).

Пример

// Leaky code to wrap HTML elements that allows you to find the custom js object by adding 
//a reference as an "expando" property
function El(node) {
  this.dom = node;
  node.el = this;
}

Затем Microsoft взломала IE, удалив все обработчики событий и свойства expando при внутренней выгрузке, поэтому это намного быстрее, чем при использовании js. Это исправление, казалось, решило наши проблемы с памятью, но не все проблемы, поскольку у людей все еще есть проблема.

Описание проблемы MS

MS выпускает патч, который «устраняет» утечки памяти:

Блог о фиксированной памяти утечки

IE по-прежнему имеет некоторые проблемы

В нашей компании мы используем ext-js. Всегда устанавливая обработчики событий с помощью ext-js, в котором есть внутренняя процедура очистки, мы не сталкивались с утечками памяти. На самом деле использование памяти растет, но останавливается примерно на 250 МБ для машины с 4 ГБ ОЗУ. Мы не думаем, что это так уж плохо, поскольку мы загружаем около 2 МБ (несжатых) файлов js, а все элементы на странице являются динамическими.

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

8
ответ дан 5 December 2019 в 15:25
поделиться

Лучшее, что я когда-либо читал о утечках памяти Javascript , написал Доулгас Крокфорд. 1278] Чтобы ответить на ваш вопрос, да, браузер обязательно должен выгружать все объекты (и, что наиболее важно, обработчики событий) в подходящее время. Если бы это было так, то не было бы утечек :)

3
ответ дан 5 December 2019 в 15:25
поделиться

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

0
ответ дан 5 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: