Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Forced call GC (http://www.flasher.ru/forum/showthread.php?t=125706)

QueenT 30.05.2009 17:41

Forced call GC
 
Скажите пожалуйста, а это, наверное, плохая практика вызывать GC в коде?

BlooDHounD 30.05.2009 17:52

его нельзя вызывать.

Merlinn 30.05.2009 17:56

а гугл зачем? http://www.dtf.ru/articles/read.php?id=51967

BlooDHounD 30.05.2009 18:31

Merlinn, статья - полный бред.

Merlinn 30.05.2009 18:36

и в чем же её бредовость?

BlooDHounD 30.05.2009 18:47

принудительного вызова GC - нету.
Цитата:

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

самый гланый бред это Memory Controller. что он контролирует? оформлен как набор копипастов. если я таких 20 штук создам? это статический класс должен быть.

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

DarkLight 30.05.2009 19:14

Цитата:

принудительного вызова GC - нету.
Статья бредовая, но в классе там есть вызов GC - старый добрый хак с двумя одноименными LocalConnection, который как работал в 9ом, так и в 10м работать, насколько мне известно, не прекращал. В AIR и дебаг плеере GC можно вызывать как System.gc(). Но толку от этого мало (пишем код правильней, чистим все что можем чистить сами - и нет проблем), а weakReference - действительно зло.

QueenT 30.05.2009 19:38

ммм.... такой тупняковый вопрос, а что GC работает только в дебаг-плеере?

BlooDHounD 30.05.2009 20:01

DarkLight, "старый добрый способ" тоже работает только в дебаге :) там что роще System.gc(), без вот этого изврата.

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

QueenT 30.05.2009 20:04

Ага, спасибо большое.

_Smirnoff 31.05.2009 02:01

Статья бред, используем небольшой наборчик...

http://www.gskinner.com/blog/archive...source_ma.html
http://groups.google.com/group/ruFla...a81e46644040b/
http://labs.adobe.com/wiki/index.php...mory_Profiling
http://livedocs.adobe.com/flex/3/htm...rofiler_3.html
http://x-geom.net/blog/?p=48
http://riapriority.com/blogs/slon-vs...g-memory-leaks
http://riapriority.com/blogs/slon-vs...15/profiling-2
http://actionscript-blog.imagination...tion-script-3/
http://groups.google.com/group/ruFla...4a81e46644040b
http://www.peachpit.com/articles/article.aspx?p=1182473

Память как и Восток, дело тонкое...

willis83 31.05.2009 12:01

Не понятно почему adobe не прикрутит такую возможность к AS, в других языках же есть. Если знаешь что уже не надо.... хлоп! и нету. А так сиди и думай ничего ли не пропустил, а вдруг где-то листенер, а вдруг ссылочка где-то.... не понятно

ramshteks 31.05.2009 12:03

а как гц опроделит что тебе что то нужно а что то нет, если на все есть ссылка?

flash33 31.05.2009 13:20

Как как, если объекту присваивается null, значит мне ни объект ни чайлды в нем не нужны.
ЗЫ Почему ГЦ а не ГК? Так правильнее

Яски 31.05.2009 13:51

Тогда уж СМ

BlooDHounD 31.05.2009 14:12

@flash33, О! щас буду пытать. Вот скажите нужен ли мне объект лежащий в ссылке b?
Код AS3:

var a:Object = new Object();
var b:Object = a;
a = null;

или так:
Код AS3:

var b:Object = new Object();
function foo(a:Object):Void {
    a = null;
}
foo( b );

по вашей логике b мне больше не нужен.

_Smirnoff 31.05.2009 14:36

Вмешаюсь. В первом случае к Object можно будет обратиться через b, несмотря на то, что а = null (Оbject просто не доступен через а). Следовательно объект еще не доступен GC. Во-втором cлучае, такая же история. b все еще нужен нам.

BlooDHounD 31.05.2009 14:54

_Smirnoff, спасибо, я в курсе. мне интересно мнение flash33.

flash33 31.05.2009 15:04

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

_Smirnoff 31.05.2009 15:12

Конечно такого обработчика нет, но ты очень быстро поймешь, если проект огромный, что ты, что-то не удалил, когда мемори лики задушат...

flash33 31.05.2009 15:25

не волнуйся, у меня в голове памяти не 64 кб.
А применительно
Код AS3:

var a:Object = new Object();
//было
//var b:Object = a;
//нужно
var b:Object = a.clone();
//метод есть для многих объектов, тогда не надо хвататься за голову, когда вдруг случайно что то не то...
a = null;


BlooDHounD 31.05.2009 15:35

flash33, гы ... знаешь какой перерасход памяти будет?

_Smirnoff 31.05.2009 15:35

Да я не про голову, а про ОЗУ. Могу сказать по опыту, что основные лики идут от bitmapData, а к ней никак нельзя clone, тогда точно все встанет. Пулы в помощь. Нужно просто качественно программировать, чтобы за всем уследить

willis83 31.05.2009 15:39

Если объект удаляется значит ссылка ведёт в никуда. Смысл в том что программисту легче отследить использование не актуальных ссылок чем наличие левых листенеров и ссылок на класс который использоваться больше не будет, а если и будет то определится по новой с новыми свойствами. Всё же не помешало бы AS такая возможность.

BlooDHounD 31.05.2009 15:39

flash33, + сколько нужно будет написать синхронизаций, когда будет такое:
Код AS3:

var b:Object = new Object();
function foo(a:Object):Void {
    a.x = 5;
}
foo( b );

в твоём варианте это будет так:
Код AS3:

var b:Object = new Object();
function foo(a:Object):Object {
    a.x = 5;
}
b = foo( b.clone() ).clone();

скорости теряется немерено.

Добавлено через 5 минут
willis83, одинаково муторно отслеживать и то и то. Вы просто не представляете, что это такое :) Вам кажется всё станет просто и прекрасно, жизнь начнёт бить ключом, и наступит мир во всём мире.

посмотрите на мои примеры повыше, и подумайте, что если у объекта будет структура немного посложнее, а что если надо будет сделать рекурсивную структуру? представьте работу 2х программистов, которым приходится работать с одним объектом, и один решает, что объект больше не нужен. а если таких программистов в 5? и это только верхушка айсберга.

flash33 31.05.2009 15:59

BlooDHounD, с чего ты взял, что я против использования ссылок? Используй их себе на доброе здоровье. Я говорю только о том, что нынешняя система не дпускает принудительной очистки памяти. Это налагает на программиста обязательство отслеживать используемую память, а программист - это не Господь Бог. Если бы существовал механизм принудительной очистки + обработка эксепшенов возникших как следствие обращения к null, то разработка больших приложений была бы гораздо легче.

Stargazer 31.05.2009 16:11

А я соглашусь с flash33.
P.S. А ещё - сделали бы они нормальные указатели...

wvxvw 31.05.2009 17:07

Цитата:

Сообщение от flash33 (Сообщение 824610)
BlooDHounD, с чего ты взял, что я против использования ссылок? Используй их себе на доброе здоровье. Я говорю только о том, что нынешняя система не дпускает принудительной очистки памяти. Это налагает на программиста обязательство отслеживать используемую память, а программист - это не Господь Бог. Если бы существовал механизм принудительной очистки + обработка эксепшенов возникших как следствие обращения к null, то разработка больших приложений была бы гораздо легче.

Немного не в тему, но где-то близко: недавно пришлось познакомится с Gaia + построеному на ее основе огромному приложению... вот это мрак...
(взято из com.gaiaframework.assets.DisplayObjectAsset)
Код AS3:

override public function destroy():void 
{
        if (_loader != null)
        {
                _loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
                _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
                _loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError);
                if (_loader.parent) _loader.parent.removeChild(_loader);
                try
                {
                        _loader.unload();
                }
                catch (e:Error)
                {
                        // fail gracefully
                }
                _loader = null;
        }
        super.destroy();
}

Это так, просто для общего представления...
Вот вам и "обработка исключений", и "очистка памяти"...

Тоесть, так чтобы стало понятнее:
- Loader.unload() не генерит исключения никогда.
- контент этого лоадера - всегда должен наследоваться от какого-то класса из фреймворка, ни один из этих дурацких классов не слушает Event.UNLOAD, соответственно, как вы можете видеть, никакой альтернативы этому событию не предтавляется (т.е. никаких колбеков / попыток как-то сказать контенту, что нужно начать выгружаться нету).

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

r_r_f_r 31.05.2009 17:38

Цитата:

Сообщение от BlooDHounD (Сообщение 824607)
посмотрите на мои примеры повыше, и подумайте, что если у объекта будет структура немного посложнее, а что если надо будет сделать рекурсивную структуру? представьте работу 2х программистов, которым приходится работать с одним объектом, и один решает, что объект больше не нужен. а если таких программистов в 5? и это только верхушка айсберга.

А можно пример 5-и программистов работающих с одним объектом?

BlooDHounD 31.05.2009 20:13

r_r_f_r, вопрос не ясен.

Stargazer, Вам тут не СИ :)

flash33, не вижу разницы в отслеживании ошибок, и отписки за собой всех событий. те же яйца, только вид сбоку. елси Вам очень хочется возиться с такой фигнёй, то можете использовать такой класс:
Код AS3:

import flash.utils.Dictionary;
 
class WeakRef {
 
        public function WeakRef(obj:*) {
                super();
                this._dic[ obj ] = true;
        }
 
        private const _dic:Dictionary = new Dictionary( true );
 
        public function get():* {
                for each ( value:* in this._dic ) {
                        return value;
                }
                return null;
        }
 
}


flash33 31.05.2009 20:29

:eek: Че это за порнография?

r_r_f_r 31.05.2009 20:29

BloodHounD, Вы написали о 5-ти программистах работающих с одним объектом, приведите пример пожалуйста, меня интересует в каком это случае каждый из них имеет право на удаление объекта?
В моей голове такого извращения даже не появляется.

Если они работают с одним объектом значит они его откуда-то получили, и как известно "вчужой монастырь ...", а если залез(т.е. удалил то этому умнику нужно давать по шапке)

А вот ключевого слова delete для сылок не хватает(чтоб удалялся объект и занулялись все ссылки на него, используешь потом - опять же по шапке).

По мне тут всё логично и порядочно, но мечтать не вредно, хотя может будет когда-нить ас5:)

BlooDHounD 31.05.2009 20:41

r_r_f_r, мдя ... нет слов.

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

etc 31.05.2009 20:50

Цитата:

Сообщение от flash33 (Сообщение 824610)
Это налагает на программиста обязательство отслеживать используемую память

По моему, это такая же важная обязанность, как и вообще слежение за тем, чтобы код работал.
Я не пойму всего этого нытья по поводу GC. Ты написал код, он создал N объектов. Приложение свою функцию выполнило и должно уничтожить эти N объектов. Почему последний этап настолько сложен — не понимаю. Единственным «оправданием» является лень и всё.

ramshteks 31.05.2009 21:02

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

Ну, а в остальных случаях действительно это просто лень.

r_r_f_r 31.05.2009 21:06

BlooDHounD, если нет слов, совсем не обязательно добавлять "мдя". Или только в условии "мдя", все 5 разработчиков смогут смело рубить объект?

BlooDHounD 31.05.2009 23:09

r_r_f_r, если у Вас так плохо с воображением, то смело вам воображу, что любой публичный объект является потенциально опасным :)
что касается программистов, то ключевое слово у Вас "могут". это не значит, что они это сделают, но если сделает, хотя бы один то ...

Stargazer 31.05.2009 23:29

Цитата:

Сообщение от BlooDHounD (Сообщение 824697)
это не значит, что они это сделают, но если сделает, хотя бы один то ...

То возник бы эксепшен при попытке получить данные там, где их нет. Тип ошибки прямо даёт понять, что переменная ссылается "куда-то вообще не туда". Догадаться о причинах нетрудно. А вот вопрос, действительно, следует задать: какого чёрта программист удалил объект, который ему не принадлежал? По вашей логике все программы, написанные на Си, потенциально нестабильны и крайне сложны в разработке (за всеми глаз да глаз).

wvxvw 31.05.2009 23:39

В других языках есть возможность контролировать, передается ли обьект по значению или по ссылке - поэтому в ктитических местах в просто получите геттер который вам вернет копию обьекта, а не ссылку. В АС такой номер не всегда пройдет, и еще менее когда уместен - поэтому где-то согласен c BlooDHounD... т.е. если давать возможность удалить, то должна быть возможность не дать удалить.

r_r_f_r 31.05.2009 23:58

Господа, в каких других языках есть возможность не удалять объект?:)
С++ :
Код:

MyClass *myClass = new MyClass();
MyClass *clk = myClass;
delete myClass;
myClass->xaxa();// получаем эсепшен.

Или вы приверженцы "халявы" для разработчика за счёт процессорного времени и оперативы.

Цитата:

что они это сделают, но если сделает, хотя бы один то ...
А если они это сделают, то тут остаётся только коментить строку delete и ждать прихода сиго молодца.


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

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