|
|
|||||
Регистрация: Nov 2010
Сообщений: 3
|
Утечка памяти
Здравствуйте, подскажите что я делаю не правильно. Класс обращается за данными каждые 10 секунд. При какдом запросе приложение все больше и больше памяти "съедает" (смотрю через flash.system.System totalMemory). Как грамотно освободиться от утечки?
public class NameClass { private var variables:URLVariables; private var urlRequest:URLRequest; private var loader:URLLoader; private var timer:Timer = new Timer(10000, 0); private var error:String; public function NameClass() { timer.addEventListener(TimerEvent.TIMER, request); timer.start(); } public function stop():void { timer.stop(); } public function start():void { timer.start(); } public function get error1():String { return error; } private function request(e:TimerEvent):void { variables = new URLVariables(); variables.md5 = MD5.hash("SomeString"); variables.data = "data"; urlRequest = new URLRequest("http://192.168.10.50/test.php"); urlRequest.data = variables; urlRequest.method = URLRequestMethod.POST loader = new URLLoader(); loader.addEventListener(Event.COMPLETE, update); loader.addEventListener(IOErrorEvent.IO_ERROR, io_error); try { loader.load(urlRequest); } catch (error:Error) { loader.removeEventListener(Event.COMPLETE, update); loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error); } } private function update(e:Event):void { loader.removeEventListener(Event.COMPLETE, update); loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error); //Обработка } private function io_error(e:IOErrorEvent):void { e.currentTarget.removeEventListener(Event.COMPLETE, update); e.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR, io_error); error = "Ошибка I/O"; this.stop(); } } |
|
|||||
Попробуйте после завершения каждой загрузки и отписки от слушателей вызывать
1. Если память перестала расти - значит утечки нет - просто GC не торопиться ее чистить, т.к. её хватает. Варианты действий: - забить, если не вызвает проблем - когда память потребуется или еще какие условия свершатся - все будет очищено; - не создавать работы для GC - сделать пул создаваемых объектов. 2. Если память расти не перестала - ищем дальше При поверхностном обзоре кода - не нашел более одного объекта, способного одновременно застрять в памяти. Еще не ясно, что происходит в "//Обработка" - может там загруженный объект застревает где-то в глубине приложения. Последний раз редактировалось expl; 08.11.2010 в 23:57. |
|
|||||
Регистрация: Nov 2010
Сообщений: 3
|
После System.gc(); память перестала расти. Пожете подсказать на счет:
Цитата:
|
|
|||||
Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
|
Цитата:
тут объяснение
__________________
Коллекционирую чужие ActionScript Блоги |
|
|||||
Регистрация: Nov 2010
Сообщений: 3
|
random13, Спасибо, но это я и сам нашел. Хотелось бы пример на AS3.
|
|
|||||
Регистрация: Dec 2009
Сообщений: 428
|
Если Вы уверены, что запрос длится менее 10 сек, что Вам мешает эти строки вынести в конструктор и создавать только один раз?
variables = new URLVariables(); variables.md5 = MD5.hash("SomeString"); variables.data = "data"; urlRequest = new URLRequest("http://192.168.10.50/test.php"); urlRequest.data = variables; urlRequest.method = URLRequestMethod.POST loader = new URLLoader(); public class NameClass { private var variables:URLVariables; private var urlRequest:URLRequest; private var loader:URLLoader; private var timer:Timer = new Timer(10000, 0); private var error:String; public function NameClass() { variables = new URLVariables(); variables.md5 = MD5.hash("SomeString"); variables.data = "data"; urlRequest = new URLRequest("http://192.168.10.50/test.php"); urlRequest.data = variables; urlRequest.method = URLRequestMethod.POST loader = new URLLoader(); loader.addEventListener(Event.COMPLETE, update); loader.addEventListener(IOErrorEvent.IO_ERROR, io_error); timer.addEventListener(TimerEvent.TIMER, request); timer.start(); } public function stop():void { timer.stop(); } public function start():void { timer.start(); } public function get error1():String { return error; } private function request(e:TimerEvent):void { try { loader.load(urlRequest); } catch (error:Error) { //loader.removeEventListener(Event.COMPLETE, update); //loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error); } } private function update(e:Event):void { //loader.removeEventListener(Event.COMPLETE, update); //loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error); //Обработка } private function io_error(e:IOErrorEvent):void { //e.currentTarget.removeEventListener(Event.COMPLETE, update); //e.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR, io_error); error = "Ошибка I/O"; this.stop(); } }
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг Последний раз редактировалось leofit; 09.11.2010 в 12:16. |
|
|||||
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Попробуйте на всякий случай использовать useWeakReference = true
P.S.: Не помню точно, но по-моему не должно возникнуть никаких проблем с использованием объекта loader повторно, без создания нового экземпляра.
__________________
#flasher@irc.trg.ru:6667 Последний раз редактировалось Obi; 09.11.2010 в 12:28. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
__________________
Тут мужик танцует и поёт про флэш |
Часовой пояс GMT +4, время: 18:00. |
|
« Предыдущая тема | Следующая тема » |
|
|