Оптимизация памяти в воздушных приложениях - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть простое эфирное приложение, которое развернуто на сервере.Все, что он делает, это то, что он отправляет httpService-запрос на веб-страницу каждые 5 минут.По какой-то причине он начинается с 25 МБ памяти (диспетчер задач), и каждый день он добавляет около 1 МБ.Я не могу понять, почему это высасывает память.У меня есть EventListener для таймера в инициализации приложения.Я прочитал несколько статей об оптимизации памяти и передовых методах разработки приложений для авиации.Они говорят, что вы должны удалить слушателей событий после их запуска.Но если я сделаю это, таймер не будет запускать какие-либо функции после его срабатывания один раз.Кто-нибудь может поделиться мыслями об оптимизации этого?Вот фрагмент моего кода:

private var service:HTTPService; 

private function init() :void { 
service = new HTTPService(); 
service.method = "GET"; 
service.url = serviceUrl; 
service.addEventListener(ResultEvent.RESULT, httpResult);
service.addEventListener(FaultEvent.FAULT, httpFault); 
callhttpService(); 
pingTimer = new Timer(pingInterval,0);
pingTimer.addEventListener(TimerEvent.TIMER,timer_doth­is);

} 

private function callhttpService():void { 
  service.send();
} 

private function timer_dothis(evt:TimerEvent):void { 
  callhttpService(); 
}

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Очевидно, что у вас утечка памяти в вашем приложении. И конечно очень полезно посоветовать отписаться о событиях после их обработки. Утечки памяти, связанные с событиями, являются одной из распространенных проблем.

Что касается вашего случая, вы не должны отписываться от события таймера, поскольку оно все еще используется в вашем приложении. Но взгляните на код, связанный с HTTP-вызовами. Как вы выполняете звонки? Может быть, вы создаете новые объекты запросов при каждом вызове и не очищаете память после их использования, отписываясь от соответствующих событий?

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

И если вы перестанете находить проблемный код, вы можете использовать профилировщик, который является частью Flash Builder Premium. Это может помочь вам.

1 голос
/ 16 апреля 2011

Как правило, вы не можете управлять памятью во Flash / AIR.Внутренняя память управляется виртуальной машиной с помощью MMgc.

https://developer.mozilla.org/en/MMgc

Таким образом, в основном то, что вы начинаете читать, является правильным (своего рода), вам нужно полностью разыменовать объекты, чтобыубедитесь, что сборщик мусора заберет их на следующем проходе, частота которого определяется внутри виртуальной машины в зависимости от производительности системы, на которой она работает.Что касается событий таймера, я бы не сказал, что вам нужно удалять / повторно добавлять прослушиватель снова и снова, но, возможно, остановите распространение события в обратном вызове события (e.stopImmediatePropagation ()).

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/Event.html#stopImmediatePropagation()

Но все, что нужно сделать, это остановить обработку события или всплыть в другом месте, и я ни на секунду не представляю, что это является причиной утечки вашей памяти.Скорее всего, где-то вы создаете и уничтожаете объекты или создаете их и просто отбрасываете их, фактически не уничтожая их должным образом.Ниже приведена ссылка на статью об отслеживании утечек во flash / AIR.Это объясняет, как все это работает со стороны ActionScript очень хорошо:

http://divillysausages.com/blog/tracking_memory_leaks_in_as3

Если вы пробежитесь по этой статье, просмотрите свой код и сузьте его до того, что вы считаетеПроблема, но не уверены, обновите свой квест с некоторыми фрагментами кода, и я обновлю свой ответ на адрес, который вы отправляете.:)

...