Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   анти GC. как? (http://www.flasher.ru/forum/showthread.php?t=145890)

cleptoman 22.10.2010 14:47

анти GC. как?
 
покосит ли GC мувики хранимые в таком ключе:
Код AS3:

var arr:Array = new Array(new MovieClip(),new MovieClip());

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

если GC косит, то альтернативы храненения ссылок? Object ? Dictionary?

udaaff 22.10.2010 14:50

Ссылки на них в массиве как раз таки и хранятся.

random13 22.10.2010 15:35

ну собственно да, ссылка есть в массиве так что не покосит

Psycho Tiger 22.10.2010 15:41

Меня вообще всегда удивляли люди, которые относились к GC как к лохнесскому чудовищу.
Вроде всё работет, всё хорошо... И тут GC своими кальмаровыми усами съели что-то крайне важное.
Запомните: пока Вы можете достучаться до объекта ЛЮБЫМ способом - он не умрёт. )

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

cleptoman 22.10.2010 17:27

пойду убеждать свою параною, что все ок )

Tails 22.10.2010 22:23

GC это так понял - чистка мусора ? Замечательная вещь. Не знаете почему нельзя удалять/очищать память от ненужных обьектов вручную ?

Psycho Tiger 22.10.2010 22:28

Потому что в этом вся соль.

Tails 22.10.2010 22:29

Psycho Tiger
Ваше 4 тысячное сообщение, поздровляю :) А в чём соль то ?

Странно что нету никакой возможности самому полностью выгрузить обьект из памяти. Сиди жди пока гц вылезет из берлоги и сожрёт.

dimarik 22.10.2010 23:15

Цитата:

Сообщение от Psycho Tiger (Сообщение 944596)
Хотя, разве что исключение может быть ENTER_FRAME в удаленном объекте, который бы дёргал статический сеттер. Но опять таки, это объект до Вас стучится, а не Вы до объекта.

Не понял. Подробностей хочется.

i.o. 22.10.2010 23:36

Цитата:

Странно что нету никакой возможности самому полностью выгрузить обьект из памяти. Сиди жди пока гц вылезет из берлоги и сожрёт.
Если зануллить везде объект, то считайте, что выгрузили из памяти. Зачем в AS3 вообще руками из памяти выгружать? AS3 не работает напрямую с памятью, следовательно и методов выгрузить из нее что-либо нет.
Если какие-то проблемы - воспользуйтесь профайлером.

Psycho Tiger 22.10.2010 23:40

Цитата:

А в чём соль то ?
Ну это давняя история. Были-жили сишники, ассеблерники и прочие люди. И работали они с памятью напрямую. Но пришли нонконформисты и сказали - это неудобно! Мы сделаем так, что машина сама решит когда пришло время что-то сделать с памятью! И сделали. Да так сделали, что кроссплатформенно получилось. С тех пор разделились языки на 2 категории: одни с GC, другие без. Мы - CLI Ecma-based язык. Мы не можем работать с памятью напрямую. Во всяком случае из AS )

Цитата:

Не понял. Подробностей хочется.
Ну, жил был объект - потомок DisplayObject`а. Повесил на него очень умный программист ENTER_FRAME, да ещё как повесил - обработчик дёргал BigClass.someMethod, куда передавал себя аргументом. А тот что-то с ним творил. Например, брал с него какие-то данные. А потом пришел GC и перестал вызываться этот метод. Потому что объект удалился. Вот так вот объект подготовленный ко смерти стучался туда, куда GC не доберется.

i.o. 22.10.2010 23:55

Цитата:

Ну, жил был объект - потомок DisplayObject`а. Повесил на него очень умный программист ENTER_FRAME
Забыл добавить, что потом этот "программист" "потерял" ссылку на вот этот вот объект, в результате чего, тот остался на растерзание GC. А в оставшееся время до часа Х, отчаянно передавал ссылку на себя в BigClass.someMethod. )))

Psycho Tiger 23.10.2010 00:35

Дада, тонувший не умел плавать, но кричал команде спасателей )

MerlinTwi 23.10.2010 11:12

Все же доп. средства управления GC не помешали бы. Например, мне очень хочется ставить GC на паузу, ему ведь пофиг, что щас отработать, что через минуту. А то этот умник частенько решает все почистить и затормозить именно в тот момент, когда каждая миллисекунда на счету (сложная 3D схема).

Psycho Tiger 23.10.2010 11:46

Так то да. Думаю, в будущем что-то похожее получим.
Сперва - почти официальный запуск GC через Loder#unloadAndStop, потом опкоды для жарки прямо в память. Whats next? )

f.g.programmer 23.10.2010 12:24

Искал когда-то тоже информацию по GC, и нашёл способ принудительного вызова
В оригинале выглядит примерно так
Код AS3:

try {
        (new LocalConnection()).connect("freg");
        (new LocalConnection()).connect("freg");
}
catch (e:Error) {
        System.gc();
        System.gc();
}

Но без вызова System.gc() (который должен работать вроде как только в air) тоже работает

Tails 23.10.2010 14:09

Один явный способ вызова есть - можно закидать его пещеру трупами
Код AS3:

new TextField();

настолько, чтобы память флешки превысила выделенный ей лемит. гц вылезет голодный и злой.

f.g.programmer 23.10.2010 14:34

В примере с try-catch и без трупов работает :)

TanaTiX 23.10.2010 14:42

Кто-то, вроде silin, если память не изменяет, предлагал грузить пустой gif из byteArray-я. У него на эту тему класс есть. При этом вызывается gc без трупов и прочих извратов.

Добавлено через 3 минуты
Вот, нашел

Psycho Tiger 23.10.2010 14:45

Ага. Суть в том, что после Loader#unloadAndStop GC запускается. silin просто сразу обернул пустую gif`ку и отдавал её Loader`у, после чего выгружал.

f.g.programmer 23.10.2010 14:49

Цитата:

грузить пустой gif из byteArray... При этом вызывается gc
Вообще-то это тоже изврат.

И насчёт мусора (это пожалуй лучше звучит чем трупы). Голодный и злой GC может не дождаться пока мы закончим валить в его пещеру мусор. Он выйдет, приберётся, а сверх прибранного мы насыплем ещё. Таким образом лишний мусор будет лежать до следующей уборки.

cleptoman 23.10.2010 15:05

я смотрю кроме прямого контроля над GC все остальное - изврат.

и вообще топик ушел в русло "как бы дать GC еще поспать" )

Psycho Tiger 23.10.2010 15:40

Есть 2 проблемы: GC вызывается слишком часто и где то пропущена ссылка, что GC что-то не ест.

Вам есть разница сколько фп ест памяти - 120 мб или 125, когда у Вас её 4 гигабайта, 3 из которых в данный момент свободны?

cleptoman 23.10.2010 16:05

кстати - о птичках..

насколько я понимаю больше 2 гигов юзать флэшплееру нельзя..это конфигурируемо?

3p.station 24.10.2010 05:44

вот полезная статья
для когото все это не ново , а комуто будет интересно

i.o. 24.10.2010 05:52

Сомнительный пункт про WeakReference.as. Так и не понял практической пользы.
Либо храним и помним где храним, а потом своевременно удаляем.
Либо кодер страдает ранним склерозом и пишет полную кашу, которую сам потом не может расхлебать.
Как-то так )

f.g.programmer 24.10.2010 11:00

Сомнительная статья, практически полностью посвящена тому, как полезно использовать слабые ссылки везде, где это только возможно.
Честно говоря слабые ссылки практически не использую. Если какой-то объект должен быть удалён, в нём останавливается вся активность, удаляются все слушатели. Доверять это дело GC кажется не очень хорошей идеей.

3p.station 24.10.2010 13:13

вот так я на нее и повелся!
спасибо что разъяснили

BlooDHounD 24.10.2010 16:27

к статье надо было коменты прочитать. да и на этом форуме форуме эту чудо-статью не раз обкладывали.


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

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