Отладка утечек памяти в FLEX / AS3 - PullRequest
6 голосов
/ 20 марта 2009

У меня довольно большое приложение Flex & Papervision3D, которое непрерывно создает и уничтожает объекты. Он также загружает и выгружает файлы ресурсов SWF. Во время работы SWF медленно потребляет около 2 ГБ памяти, когда проигрывает плеер. Очевидно, я почти уверен, что отпущу ссылки на случаи, которые мне больше не нужны, с ожиданием, что GC выполнит свою работу. Но у меня чертовски много времени выясняется, в чем проблема.

Я пытался использовать профилировщик и его опции для захвата снимков памяти и т. Д., Но моя проблема остается уклончивой. Я думаю, что есть известные проблемы с использованием отладочного Flash Player также? Но я тоже не получаю радости от использования релизной версии.

Как вы решаете проблемы утечки памяти с помощью FLEX / AS3? Какие стратегии, приемы или инструменты вы использовали для определения местоположения потребления

Ответы [ 4 ]

4 голосов
/ 20 марта 2009

Я обычно реализую метод очистки в каждом создаваемом классе (поскольку в AS нет деструкторов). Основная проблема, которую я заметил с GC, связана со слушателями событий. В дополнение к тому, что прямо сказано, также старайтесь избегать анонимных функций слушателя (так как вы не можете явно удалить их). Вот несколько ссылок, которые вы можете найти полезными:

3 голосов
/ 18 марта 2010

из-за подобных проблем я разработал библиотеку с открытым исходным кодом, которая помогает отслеживать все события, которые вы запускаете в любой момент времени. его действительно легко реализовать, и я за 10-15 минут пересмотрел проекты, преобразовав их в разработанный мной EventController.

в основном для вашего сценария я бы пропустил все события и заменил их на: obj.addEventListener (...);

до: EC.add (объект, ...);

остальное то же самое, что и сделать, это зарегистрировать событие и упростить просмотр всех ваших событий в любой момент, когда вы захотите, с помощью EC.log ();

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

сайт: http://fla.as/ec/

3 голосов
/ 20 марта 2009

Я наткнулся на что-то, объясняющее, как использовать Flex Profiler в Flex Builder, и это было ОГРОМНОЙ помощью для устранения утечек памяти. Я определенно предложил бы попробовать это. Это очень просто в использовании. Некоторые вещи, которые я нашел при профилировании моих приложений:

Избегайте использования коллекций (по крайней мере, БОЛЬШИХ коллекций) в качестве свойств объектов значений. У меня было несколько типов классов объектов-значений в моем приложении Cairngorm, и у каждого было свойство "children", которое имело значение ArrayCollection и использовалось для фильтрации. При профилировании я обнаружил, что это был один из моих самых больших пожирателей памяти, поэтому я изменил свое приложение, чтобы вместо этого сохранять «parentId» как int и использовать его для фильтрации. Используемая память была резко сокращена. Как то так:

Старый путь:

public class Owner1
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner2 Objects
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner3 Objects
}

public class Owner3
{
    public var id:int;
    public var label:String;
}

Новый путь:

public class Owner1
{
    public var id:int;
    public var label:String;
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner1 Object
}

public class Owner3
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner2 Object
}

Я бы также предложил удалить прослушиватели событий, когда они больше не нужны.

2 голосов
/ 20 марта 2009

Если утечка памяти растет в геометрической прогрессии, это, вероятно, означает, что GC не справляется со своей работой. Посмотрите на свой код и посмотрите, где вы можете уменьшить количество ссылок на ваши объекты (установив их на null). Сделайте обработчики событий слабыми. И перепрофилировать.

...