Timer против GC.
Все просто. Пока тикает экземпляр Timer, он не может быть удален сборщиком мусора (Garbage Collector).
Теорему доказывал на FP 10.0
Все было известно ранее.
Всего комментариев 16
Комментарии
|
|
|
краткость — сестра таланта )
|
|
|
|
Содержательно
![]() Насколько помню школьную программу, за каждой теоремой следует доказательство ![]() Хотя на самом деле больше интересует, что именно подвигло на вынесение подобного вывода в блог. |
|
|
Обновил(-а) TanaTiX 22.02.2011 в 01:32
|
|
|
|
TanaTiX, Вы правильно помните школьную программу.
Теорема настолько проста, что её доказательство я оставил на домашнюю проверку. Мораль, тем не менее, очевидна. Не оставляйте бесконечных таймеров (88 байт памяти каждый) с подписчиками (еще 64 байта на массив слушателей, итого 152 байта), если дорога память. |
|
|
Обновил(-а) dimarik 22.02.2011 в 00:39
|
|
|
|
Знаем, плавали. Но спасибо, что ещё раз напомнил )
|
|
|
|
Тигра, может быть ты сможешь доказать теорему?
|
|
|
|
Собственно, таймер подписывается на «тикающий» поток в дебрях плеера и висит на нём в виде очередного таска. Поэтому и живёт.
|
|
|
|
а что на счет setTimeout / setInterval ? Там тоже как то все непросто..
|
|
|
|
Это методы. Как можно проследить за их "удалением"? )
|
|
|
|
Цитата:
Сообщение от TanaTiX
Хотя на самом деле больше интересует, что именно подвигло на вынесение подобного вывода в блог.
Вот неудачный пример "несостоявшегося" удаления подписанного таймера class TimerExample { public function TimerExample() { const timer:Timer = new Timer(1e3, 10);// 10 раз, тикает раз в секунду. timer.addEventListener(TimerEvent.TIMER, this.handler_timer); timer.start(); } private function handler_timer(event:TimerEvent):void { trace( (event.target as Timer).currentCount ); // System.gc(); // Не помогает =) } } А так как мы не создавали ссылок на timer в поле класса, то теперь он должен быть доступен для сбора GC. Однако мы наблюдаем трейсы, что говорит нам о том, что объект таймера жив. "Классики" говорят нам о том, что мы не отписались от события TimerEvent.TIMER, поэтому получаем сообщения от "потустороннего" таймера. А я вам говорю, что работающий (тикающий) таймер ВООБЩЕ не удаляется. И удаление метода слушателя из списка диспетчера вообще не влияет на удаление самого диспетчера. Что является условием удаления объекта из памяти? Правильно, отсутствие на этот объект ссылок. Какие ссылки остались на таймер? Правильно, никаких. Почему он не удаляется? Правильно, он особенный. Упростим. За время работы таймера профайлер указывает его присутствие. Как только таймер отработал, он удалится. |
|
|
Обновил(-а) dimarik 22.02.2011 в 01:15
|
|
|
|
@BloodHound
Цитата:
setTimeout и setInterval - это обёртки вокруг таймера. так что внутренний таймер будет жить
|
|
|
|
А чем ENTER_FRAME отличается от каких-либо других событий?
|
|
|
|
Другие события сложно распространять, если все ссылки на распространитель уничтожены
|
Последние записи от dimarik
- Memory allocation на Vector.<IInterface> (07.05.2015)
- [Starling] Тормози меня плавно! (28.10.2014)
- [Starling идиотизмы] Об интерактивных событиях (02.10.2014)
- О типах исключений. (23.04.2014)
- Немного о Vector и ByteArray (28.03.2014)














