Циклические ссылки

Циклические ссылки

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

Рис. 7.3. Основной шаблон циклической ссылки

Утечка в таком шаблоне происходит из-за особенностей учета DOM-ссылок. Объекты скриптового движка удерживают ссылку на DOM-элемент и ожидают, пока будут освобождены все внешние ссылки, чтобы освободить, в свою очередь, этот указатель на DOM-элемент. В нашем случае у нас две ссылки на объект скрипта: внутри области видимости скриптового движка и от расширенного свойства DOM-элемента. По окончанию своей работы скрипт освободит первую ссылку, но ссылка из DOM-элемента никогда не будет освобождена, потому что ждет, что это сделает объект скрипта!

Наверное, первой же мыслью будет, что такой сценарий развития событий легко обнаружить и устранить, однако на практике представленный базовый случай является только вершиной айсберга. Может оказаться так, что циклическая ссылка находится в конце цепочки из 30 объектов, а обнаружить ее при этом крайне тяжело.

Стоит посмотреть, как данный шаблон будет выглядеть в HTML. Это может вызвать утечку, используя глобальную переменную и DOM-объект, как показано ниже.

<script type="text/javascript">

var myGlobalObject;

function SetupLeak()

{

// Для начала создадим ссылку из скрипта на DOM-элемент

myGlobalObject = document.getElementById("LeakedDiv");

// Потом установим ссылку из DOM на глобальную переменную

document.getElementById("LeakedDiv").expandoProperty =

myGlobalObject;

}

function BreakLeak()

{

document.getElementById("LeakedDiv").expandoProperty = null;

}

window.onload = SetupLeak;

window.onunload = BreakLeak;

</script>

Чтобы разрушить этот шаблон, можно использовать явное присвоение null тому свойству, которое «течет». Таким образом, при закрытии документа мы сообщаем скриптовому движку, что между DOM-элементом и глобальной переменной нет больше никакой связи. В результате все ссылки будут очищены, и сам DOM-элемент будет освобожден. В таком случае веб-разработчик знает больше о внутренних отношениях между объектами, чем сам скрипт, и может поделиться этой информацией со скриптом.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Символические ссылки. Жесткие ссылки.

Из книги автора

Символические ссылки. Жесткие ссылки. Немного теорииВ системах Unix довольно часто возникает необходимость иметь для одного и того же файла или каталога разные имена. При этом одно из имен логично назвать основным, а все другие - его псевдонимами. В терминологии Unix такие


4.3.Ссылки

Из книги автора

4.3.Ссылки Иногда очень полезно, чтобы в каталоге находился один и тот же файл, но под разными именами. Можно просто скопировать этот файл в другой, но при этом неэффективно используется дисковое пространство. Для этих целей в ОС Linux существует специальный тип файлов —


19.6.11 Ссылки

Из книги автора

19.6.11 Ссылки Чтобы включить в документ ссылку, нужно:? Использовать теги начала и конца ссылки? Указать URL связанного со ссылкой документа? Обеспечить метку для щелчка мышью (обычно выводится подчеркиванием или голубым цветом).Ниже показан пример ссылки. Символ А


Ссылки

Из книги автора

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


Ссылки

Из книги автора

Ссылки На вкладке Ссылки собрано все, что касается расстановки по тексту различных ссылок и


Ссылки

Из книги автора

Ссылки Кроме указателей С++ поддерживает также концепцию «ссылки». Подобно указателю, ссылка в С++ хранит адрес объекта. Основными отличиями являются следующие:• Объявляются ссылки с применением оператора & вместо *.• Ссылка должна быть инициализирована и не может в


Циклические конструкции

Из книги автора

Циклические конструкции Для организации циклического выполнения программных блоков в языке Object Pascal используют циклические конструкции трех типов: for-do, while-do и repeat-until. Они отличаются характером начала и завершения


Ссылки

Из книги автора

Ссылки Ссылки на книги Джосаттиса и Остерна в предыдущем абзаце дают представление о том, как в этой книге оформляются библиографические ссылки. Как правило, я стараюсь включить в ссылку достаточно информации, чтобы ее узнали люди, уже знакомые с этим трудом. Если вы уже


Циклические сэмплы

Из книги автора

Циклические сэмплы Циклические сэмплы, или сэмплерные петли, – популярный тип сэмплов. Программные устройства воспроизведения сэмплов позволяют создавать полноценные музыкальные произведения путем соединения циклических сэмплов. Чтобы создать циклический сэмпл,


Ссылки

Из книги автора

Ссылки Разработчик Delphi Русскоязычные N Сервер Описание 1 http://www.inprise.ru Российское представительство Inprise Фирма – разработчик


18.2.2. Циклические операторы

Из книги автора

18.2.2. Циклические операторы Цикл, или итерация, — это процесс повторного выполнения наборов команд. В распоряжении пользователя имеется три вида операторов цикла: for loop Последовательная обработка значений до тех пор, пока не встретится окончание списка until


2.5. Ссылки

Из книги автора

2.5. Ссылки 2.5.1. В программных документах допускаются ссылки на стандарты (кроме стандартов предприятий), технические условия и другие документы (например, документы органов Государственного надзора, правила и нормы Госстроя СССР). При ссылках на стандарты и технические


Циклические ссылки между модулями

Из книги автора

Циклические ссылки между модулями Циклические ссылки модулей в интерфейсных частях запрещены. Например, следующая ситуация ошибочна: unit A; interface uses B; implementation end. unit B; interface uses A; implementation end. Таким образом, невозможно определить два общедоступных класса в разных модулях с


Ссылки

Из книги автора

Ссылки Вы, наверное, слышали о ссылках и гиперссылках? Чем же ссылка отличается от гиперссылки? Честно говоря, ничем. Просто гиперссылка звучит посолиднее. На самом деле, если из контекста понятно, о чем идет речь, то можно употребить слово «ссылка». Если существует некая