У нас есть огромные гибкие приложения, использующие несколько модулей. Существует огромная проблема с утечкой памяти при длительном использовании модулей погрузки и разгрузки.Flex 3 Проблема с утечкой памяти
Основываясь на результатах поиска и разных статьях, я понимаю, что мне нужно очищать объекты при выгрузке, удалять прослушиватели событий, останавливать таймеры и устанавливать любые ссылки.
Я начал это, набрав один компонент за один раз в одном из модулей.
Вот как это структурировано.
Существует одно родительское приложение, которое загружает модуль, который имеет несколько видов. Компонент определяется в mxml и упоминается в модуле mxml в стеке представлений.
Этот MXML компонент является VBox со слушателями событий добавил как-
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
paddingTop="10"
paddingLeft="10"
paddingBottom="10"
paddingRight="10"
creationComplete="onInit()"
show="onShow()"
resize="onResize(event)" ....
Есть несколько свойств, которые переплетены из родительского контейнера в MXML. Помимо вышеуказанных слушателей есть также собственная переменная доступна извне -
[Bindable]
private var _model:SModelLocator=SModelLocator.GetInstance();
На выгрузке модуля ввода вызова функции Dispose в этом компоненте, как
ценам нижеpublic function dispose():void
{
this.removeEventListener(FlexEvent.CREATION_COMPLETE,onInit);
this.removeEventListener(FlexEvent.SHOW,onShow);
this.removeEventListener(ResizeEvent.RESIZE,onResize);
var arr:Array = this.getChildren();
for(var i:int = 0; i<arr.length;i++)
delete arr[i];
this.removeAllChildren();
_model = null;
//Properties that are binded from the parent container
Property1 = null;
Property2 = null;
this.deleteReferenceOnParentDocument(this.parentDocument as IFlexDisplayObject);
}
Теперь, когда я запускаю профайлер и переключаться между модулями число экземпляров этого компонента продолжает расти. Я нажал на GC Collect на профилировщике, и все еще остается.
На родительском контейнере, который является модуль MXML, я также попробовал писать следующие строки после выгрузки модульно
//function call to invoke dispose as above
component1.dispose();
component1 = null;
Пожалуйста, помогите. Я не уверен, что мне здесь не хватает, или даже если это правильный подход.
Спасибо.
Спасибо за помощь. Вот что я сделал. 1. Да, я использую профилировщик adobe, чтобы увидеть, что я получаю утечку памяти. Это подтверждается, и load-unload увеличивает количество экземпляров компонентов. 2. Я попробую сделать этот шаг. Однако это долгий процесс, но я думаю, что нужно сделать. 3. Спасибо, я буду следовать этой статье. 4. Безусловно, следующие шаги в будущем. Но сейчас я должен найти краткосрочное решение. Я отправлю обратно то, что я нахожу. Спасибо – Nikhil
утечка памяти и краткосрочное решение в flex не входят в одно и то же предложение, извините, но я могу говорить из опыта. Возможно, вы можете убить большого преступника, используя стратегию удаления всего кода и оттуда. – bitoiu