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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.03.2010, 17:06
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 1  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
По умолчанию как работает сборщик мусора?

Что-то я не пойму - как работает сборщик мусора. То есть глобально все ясно - если на переменную никто не ссылается - она помечается на удаление.
Но...

1. Предположим, у нас MovieClip, в который addChild()-ом добавили Sprite. У этого sprite свойство parent ссылается на этот MovieClip, значит такой мувик никогда не будет удален?

2. Если сделали var r = BitmapData(), попользовались им (как промежуточным битмэпом, то есть так что он больше не используется), и дальше приравняли r=null, не вызвав r.dispose() -- увидет ли сборщик мусора данные, которые содержались в битмэпе?

3.если на мувике нарисовали что-то через graphics.gradientFill() используя BitmapData, а потом мувиком попользовались и выбросили. для битмэпа dispose ведь не вызывался? значит получается что ссылаясь друг на друга такая конструкция никогда не загарбажится?

4. Практика показывает, что конструкции вроде myvar.addEventListener("tralala", myfunc, false, 0, true ) иногда "ломаются" и внезапно перестают работать. При этом сам обьект myvar вроде как есть, он не локальная переменная и null ему никто не присваивал. Это глюки gc или тут другая причина?

Старый 04.03.2010, 23:20
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 2  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
сорри за оффтоп, поскольку не совсем по теме, но GC с моей точки зрения всегда включается невовремя )))

Старый 04.03.2010, 23:28
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 3  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
GC собирает мусор по 2 критериями - первый, если не осталось ссылок на объект и второй - забыл какой, но как раз таки как вы в пункте 1 описали, так что...
1) Удалит, если занулили все ссылки на этот мувиклип (включая удаление из дисплей листа)
2) Да, удалит - но когда это будет неизвестно, поэтому лучше сделать dispose()
3) Аналогично с пунктом 1 - выбросится когда нибудь.
4) Что есть ломаются?

Старый 04.03.2010, 23:39
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 4  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
Все это можно легко проверить на практике с помощью профайлера.

1. "возможно" будет удален, СМ не обладает высоким интеллектом, в данном случае лучше всего уничтожать вручную.
2. то же самое что в первом пункте.
3. никто ни на кого не ссылается.
4. "weak reference" использовать я лично вообще не рекомендовал бы, так как gc их съедает если они ему по вкусу.

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

Вообще работа с памятью во флэше очень замороченная, и как оказалось на практике желательно еще и все string'и сбрастывать в null в случае если нет в них больше необходимости. Как например у вас есть какой-нибудь класс наследованный от абстрактного AbstractData

Код AS3:
public class InfoData extends AbstractData {
  public var userName : String;
  public var userId : String;
 
  public function InfoData() {
    super();
  }
}
никаких иных свойств (включая наследованных) у класса нет а абстрактный "не наследуется ни от чего". так вот при удалении экземпляра класса InfoData, т.е.

Код AS3:
var test : InfoData = new InfoData();
test.userName = "Vasya Pupkin";
test.userId = "12312afe99e30";
 
test = null;
"Возможно" из памяти он и удалится но строки останутся жить, до никому неведомой по счету итерации gc (проверено на практике). Собственно работа с памятью повторюсь крайне уныла (я говорю про 9ый плеер, в десятом я не проверял).

Добавлено через 3 минуты
вся эта возня с занулением уничтожением и т.д. приводит к избыточности кода, от которого к сожалению никуда не скроешься...
__________________
Блог, Twitter
Брюзга.

Старый 05.03.2010, 14:02
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 5  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
Ээ, а где взять профайлер? Из флекса? А если у меня флеш-проект?



3. Ну, я проводил эксперимент. Создаем Sprite, делаем в нем градиентную заливку, используя в качаесте градиента BitmapData. После этого делаем битмэпдате dispose(). И градиентная заливка в спрайте - тоже уничтожается. Это наводит на мысль, что внутренее представление графики (Sprite.graphics) когда делаешь заливку, ссылается каким-то образом на соответствующее BitmapData.


Последний раз редактировалось chabapok; 05.03.2010 в 14:11.
Старый 05.03.2010, 14:05
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 6  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
СМ - сборщик мусора.
Профайлер да во Флекс Билдере например, в ФДТ тоже появился но пока что не совсем хорошо работает.
__________________
Блог, Twitter
Брюзга.

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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