Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.11.2010, 20:53
Lascc вне форума Посмотреть профиль Отправить личное сообщение для Lascc Найти все сообщения от Lascc
  № 1  
Ответить с цитированием
Lascc

Регистрация: Nov 2010
Сообщений: 3
По умолчанию Утечка памяти

Здравствуйте, подскажите что я делаю не правильно. Класс обращается за данными каждые 10 секунд. При какдом запросе приложение все больше и больше памяти "съедает" (смотрю через flash.system.System totalMemory). Как грамотно освободиться от утечки?
Код AS3:
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();		
		}
	}

Старый 08.11.2010, 23:50
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Попробуйте после завершения каждой загрузки и отписки от слушателей вызывать
Код AS3:
System.gc();//Работает только в дебажной версии флешплеера
1. Если память перестала расти - значит утечки нет - просто GC не торопиться ее чистить, т.к. её хватает.
Варианты действий:
- забить, если не вызвает проблем - когда память потребуется или еще какие условия свершатся - все будет очищено;
- не создавать работы для GC - сделать пул создаваемых объектов.

2. Если память расти не перестала - ищем дальше

При поверхностном обзоре кода - не нашел более одного объекта, способного одновременно застрять в памяти.

Еще не ясно, что происходит в "//Обработка" - может там загруженный объект застревает где-то в глубине приложения.


Последний раз редактировалось expl; 08.11.2010 в 23:57.
Старый 09.11.2010, 10:56
Lascc вне форума Посмотреть профиль Отправить личное сообщение для Lascc Найти все сообщения от Lascc
  № 3  
Ответить с цитированием
Lascc

Регистрация: Nov 2010
Сообщений: 3
После System.gc(); память перестала расти. Пожете подсказать на счет:
Цитата:
не создавать работы для GC - сделать пул создаваемых объектов.
Как это сделать? Где посмотреть примеры кода?

Старый 09.11.2010, 11:54
random13 вне форума Посмотреть профиль Отправить личное сообщение для random13 Найти все сообщения от random13
  № 4  
Ответить с цитированием
random13
 
Аватар для random13

Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
Цитата:
Сообщение от Lascc Посмотреть сообщение
После System.gc(); память перестала расти. Пожете подсказать на счет:

Как это сделать? Где посмотреть примеры кода?
http://ru.wikipedia.org/wiki/%D0%9E%...BF%D1%83%D0%BB

тут объяснение
__________________
Коллекционирую чужие ActionScript Блоги

Старый 09.11.2010, 12:04
Lascc вне форума Посмотреть профиль Отправить личное сообщение для Lascc Найти все сообщения от Lascc
  № 5  
Ответить с цитированием
Lascc

Регистрация: Nov 2010
Сообщений: 3
random13, Спасибо, но это я и сам нашел. Хотелось бы пример на AS3.

Старый 09.11.2010, 12:12
leofit вне форума Посмотреть профиль Отправить личное сообщение для leofit Найти все сообщения от leofit
  № 6  
Ответить с цитированием
leofit
 
Аватар для leofit

Регистрация: Dec 2009
Сообщений: 428
Если Вы уверены, что запрос длится менее 10 сек, что Вам мешает эти строки вынести в конструктор и создавать только один раз?
Код AS3:
			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();
Даже вот так если по хорошему

Код AS3:
 
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.
Старый 09.11.2010, 12:16
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 7  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Попробуйте на всякий случай использовать useWeakReference = true

P.S.: Не помню точно, но по-моему не должно возникнуть никаких проблем с использованием объекта loader повторно, без создания нового экземпляра.
__________________
#flasher@irc.trg.ru:6667


Последний раз редактировалось Obi; 09.11.2010 в 12:28.
Старый 09.11.2010, 13:43
random13 вне форума Посмотреть профиль Отправить личное сообщение для random13 Найти все сообщения от random13
  № 8  
Ответить с цитированием
random13
 
Аватар для random13

Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
Цитата:
Сообщение от Obi Посмотреть сообщение
Попробуйте на всякий случай использовать useWeakReference = true

P.S.: Не помню точно, но по-моему не должно возникнуть никаких проблем с использованием объекта loader повторно, без создания нового экземпляра.
не лучшая практика
__________________
Коллекционирую чужие ActionScript Блоги

Старый 09.11.2010, 13:48
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 9  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Сообщение от random13 Посмотреть сообщение
не лучшая практика
Почему?

Старый 09.11.2010, 16:42
random13 вне форума Посмотреть профиль Отправить личное сообщение для random13 Найти все сообщения от random13
  № 10  
Ответить с цитированием
random13
 
Аватар для random13

Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Почему?
а что хорошего в слабых ссылках, на сколько я знаю лучше все предварительно подчистить за собой чтоб объект удалился
__________________
Коллекционирую чужие ActionScript Блоги

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:00.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.