Отладка утечки памяти FLEX/AS3

Вы должны попробовать что-то, прежде чем запрашивать желаемый результат.

Перебирая список списка, имея уникальный идентификатор, вы можете использовать функцию перечисления, которая «дает индексатор» списка.

for i,sub_list in enumerate(lst):
    identifier = i
    [(value,identifier) for value in sublist]
    ....

Надеясь, это поможет

6
задан Scott Evernden 20 March 2009 в 05:41
поделиться

4 ответа

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

Избегайте использования наборов (по крайней мере, Большое количество) как свойства Объектов Значения. У меня было несколько типов Классов объектов Значения в моем приложении Дымчатого топаза, и у каждого было "дочернее" свойство, которое было 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
}

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

3
ответ дан 9 December 2019 в 20:49
поделиться

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

2
ответ дан 9 December 2019 в 20:49
поделиться

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

4
ответ дан 9 December 2019 в 20:49
поделиться

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

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

на: EC.add (obj ,. ..);

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

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

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

3
ответ дан 9 December 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: