Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > dimarik

Оценить эту запись

Timer против GC.

Запись от dimarik размещена 21.02.2011 в 23:41
Обновил(-а) dimarik 13.03.2011 в 23:29

Все просто. Пока тикает экземпляр Timer, он не может быть удален сборщиком мусора (Garbage Collector).

Теорему доказывал на FP 10.0

Все было известно ранее.
Всего комментариев 16

Комментарии

Старый 21.02.2011 23:46 i.o. вне форума
i.o.
 
Аватар для i.o.
краткость — сестра таланта )
Старый 21.02.2011 23:48 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Содержательно
Насколько помню школьную программу, за каждой теоремой следует доказательство
Хотя на самом деле больше интересует, что именно подвигло на вынесение подобного вывода в блог.
Обновил(-а) TanaTiX 22.02.2011 в 01:32
Старый 21.02.2011 23:57 dimarik вне форума
dimarik
 
Аватар для dimarik
TanaTiX, Вы правильно помните школьную программу.

Теорема настолько проста, что её доказательство я оставил на домашнюю проверку.

Мораль, тем не менее, очевидна. Не оставляйте бесконечных таймеров (88 байт памяти каждый) с подписчиками (еще 64 байта на массив слушателей, итого 152 байта), если дорога память.
Обновил(-а) dimarik 22.02.2011 в 00:39
Старый 22.02.2011 00:11 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Знаем, плавали. Но спасибо, что ещё раз напомнил )
Старый 22.02.2011 00:21 dimarik вне форума
dimarik
 
Аватар для dimarik
Тигра, может быть ты сможешь доказать теорему?
Старый 22.02.2011 00:24 etc вне форума
etc
 
Аватар для etc
Собственно, таймер подписывается на «тикающий» поток в дебрях плеера и висит на нём в виде очередного таска. Поэтому и живёт.
Старый 22.02.2011 00:30 i.o. вне форума
i.o.
 
Аватар для i.o.
а что на счет setTimeout / setInterval ? Там тоже как то все непросто..
Старый 22.02.2011 00:38 dimarik вне форума
dimarik
 
Аватар для dimarik
Это методы. Как можно проследить за их "удалением"? )
Старый 22.02.2011 00:42 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
@i.o., setTimeout и setInterval - это обёртки вокруг таймера. так что внутренний таймер будет жив.
@dimarik, не так страшны байты таймера, как рутовый класс какой-нить подгруженной свф.
Старый 22.02.2011 00:52 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Тигра, может быть ты сможешь доказать теорему?
Ну доказать её можно только изучив сырцы Тамарина. Мы просто спостулировали факт в закон. Как в учебниках физики. Мы не знаем, почему тела тянуться друг к другу... но они тянуться и мы можем это описать )
Старый 22.02.2011 01:09 dimarik вне форума
dimarik
 
Аватар для dimarik
Цитата:
Сообщение от TanaTiX
Хотя на самом деле больше интересует, что именно подвигло на вынесение подобного вывода в блог.
Причина проста. Есть довольно распрострененное мнение, что не отписавшись от подписчика, объект, на события которого подписываются не удалится из памяти сборщиком мусора (при отсутствии других ссылок на него). В качестве примера приводят именно вариант с таймером (Timer). Я сообщаю о том, что экземпляр Timer не удаляется, если он "тикает", т.е. его currentCount <= repeatCount или repeatCount = 0 (он тикает бесконечно).

Вот неудачный пример "несостоявшегося" удаления подписанного таймера

Код AS3:
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 в конструкторе должна быть удалена после исполнения кода в конструкторе.
А так как мы не создавали ссылок на timer в поле класса, то теперь он должен быть доступен для сбора GC. Однако мы наблюдаем трейсы, что говорит нам о том, что объект таймера жив.

"Классики" говорят нам о том, что мы не отписались от события TimerEvent.TIMER, поэтому получаем сообщения от "потустороннего" таймера. А я вам говорю, что работающий (тикающий) таймер ВООБЩЕ не удаляется. И удаление метода слушателя из списка диспетчера вообще не влияет на удаление самого диспетчера.

Что является условием удаления объекта из памяти? Правильно, отсутствие на этот объект ссылок. Какие ссылки остались на таймер? Правильно, никаких. Почему он не удаляется? Правильно, он особенный.

Упростим.
Код AS3:
class TimerExample {
 
    public function TimerExample() {
        const timer:Timer = new Timer(1e3, 10);// 10 раз, тикает раз в секунду.
        timer.start();
    }
 
}
За время работы таймера профайлер указывает его присутствие. Как только таймер отработал, он удалится.
Обновил(-а) dimarik 22.02.2011 в 01:15
Старый 22.02.2011 01:24 dimarik вне форума
dimarik
 
Аватар для dimarik
@BloodHound
Цитата:
setTimeout и setInterval - это обёртки вокруг таймера. так что внутренний таймер будет жить
Да, забыл про это. Будут, выходит, жить. Особенно в setInterval.
Старый 27.02.2011 15:08 expl вне форума
expl
Цитата:
Собственно, таймер подписывается на «тикающий» поток в дебрях плеера и висит на нём в виде очередного таска. Поэтому и живёт.
Но Event.ENTER_FRAME это почему-то не касается и события от спрайта идут ровно столько, сколько позволяет ему жить GC.
Хотя да, чем слушать этот внутренний тикающий поток, когда спрайт со слушателем снесен из памяти
Старый 27.02.2011 18:18 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
А чем ENTER_FRAME отличается от каких-либо других событий?
Старый 08.03.2011 15:58 expl вне форума
expl
Другие события сложно распространять, если все ссылки на распространитель уничтожены
Старый 08.03.2011 18:45 dimarik вне форума
dimarik
 
Аватар для dimarik
Даже если ссылки на объект-источник события уничтожены, то до тех пор, пока он жив, будет распространение событий, покуда GC его не убьет окончательно. Только вот timer не убьется, пока он тикает. Вот и вся разница. Кстати, нашел у Мука этот неудачный пример с setInterval, который является оберткой над таймером.
 

 


Часовой пояс GMT +4, время: 22:17.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.