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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.04.2011, 11:19
Dragon rideR вне форума Посмотреть профиль Отправить личное сообщение для Dragon rideR Найти все сообщения от Dragon rideR
  № 1  
Ответить с цитированием
Dragon rideR
 
Аватар для Dragon rideR

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

Подскажите пожалуйста, если я создаю переменную внутри функции после ее окончания сборщик мусора разве не должен ее автоматически удалять.
Ситуация такая в интервале задал вызов функции в которой создается локальная переменная (я понимаю что можно ее создание вынести за пределы функции и использовать один и тот же экземпляр, но сейчас вопрос в другом) больше никаких циклов не запущенно. проверяю дебагером память медленно утекает и примерно за 20 мин простоя объем памяти увеличивается на 20 мб.
вот пример функции
Код AS3:
public function getRelations(user:String)
		{
			var variables=new URLVariables();
			variables.user_id=user;
			url=Params.server_url + "actions.php?rend=" + Math.random();
			var request=new URLRequest(url);
			request.data=variables;
			request.method=URLRequestMethod.POST;
			var loader_relations=new URLLoader();
			loader_relations.addEventListener(Event.COMPLETE, this.onComlete);
			loader_relations.addEventListener(IOErrorEvent.IO_ERROR, this.onError);
			loader_relations.load(request);
		}
	private function onComlete(e:Event):void
		{
			this.parseXML(e.target.data);
		}
private function onError(e:Event):void
		{
			Log("onError xml = " + e)
		}

Старый 25.04.2011, 11:25
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Либо не срабатывает GC, либо проблема на другом участке кода.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 25.04.2011, 11:35
Dragon rideR вне форума Посмотреть профиль Отправить личное сообщение для Dragon rideR Найти все сообщения от Dragon rideR
  № 3  
Ответить с цитированием
Dragon rideR
 
Аватар для Dragon rideR

Регистрация: Jan 2007
Сообщений: 368
т.е. теоретически var variables=new URLVariables(); после окончания исполнения функции должен удаляться GC?

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

блогер
Регистрация: Jun 2005
Адрес: RU
Сообщений: 1,540
Записей в блоге: 12
да, только помоему не после окончания исполнения функции , а спустя какое то время

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
а спустя какое то время
Спустя какое-то количество выделенной памяти или количество обращений для ее выделения
__________________
...вселенская грусть

Старый 25.04.2011, 11:56
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>после окончания исполнения функции должен удаляться GC?
не должен, GC запускается по каким-то своим критериям, связанным с общим расходом памяти
отсутствие ссылок на объект совсем не повод для запуска GC, думаю, что это относится и к локальным переменным
глянь пример http://silin.su/#AS3/utils/gc
к слову эту утилиту можно использовать и чтоб пощупать: а здесь ли именно течет

Старый 25.04.2011, 14:42
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
ОК... во-первых, удаляется не переменная, а объект, который вы создаете. Это не одно и то же. Переменная удаляется как только лексическое окружение в котором она объявлена перестает существовать. Если вы не используете анонимные функции, то срок жизни лексического окружения равен сроку выполнения функции.
Например:
Код AS3:
function foo():void
{
    var bar:Object = {};
} // переменная bar удаляется тут, а объект к которому она хранит ссылку записывается в кучу и удалится когда-нибудь
Такой вариант:
Код AS3:
function foo():Function
{
    var bar:Object = {};
    return function baz():void { bar.property = "value"; }
} // переменная bar будет существовать так долго, как долго просуществует функция baz "захватившая" ее
Второй вариант часто чреват утечками памяти которые очень тяжело диагностировать. Но, в вашем случае может быть еще и:
- не срабатывает мусорщик (он будет срабатывать когда памяти будет не достаточно, или когда ему покажется, что можно).
- память фрагментируется. Даже если мусорщик регулярно срабатывает, он в пределах одного своего цикла может не дефрагментировать освободившуюся память т.как это ресурсозатратно. И не смотря на то, что объекты удалятся, память отведенная для них не будет повторно использоваться и будет выглядеть со стороны как будто она все еще занята.
- мы наверняка не знаем точно о внутреннем устройстве URLLoader, равновероятно, что он может "заставить" хранить ссылку на себя где-нибудь, когда вы вызываете addEventListener(), а может и нет. Рисковать / делать это наугад - а зачем? Отписывайтесь от событий после получения, если слушатели и объекты вам больше не нужны - и вам сразу станет спокойнее.

EDIT: Единственное доказательство дающее стопроцентную уверенность в том, что имеет место утечка памяти, а не, например, низкая активность мусорщика - это если вы полчите OutOfMemoryError - тогда, значит, да, вы использовали всю память и мусорщик не мог освободить ее, т.как считал, что она все еще нужна. Конечно, иногда можно с почти полной уверенностью сказать, что утечка есть и до того, как это случится, но чтобы наверняка - только так.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 25.04.2011 в 14:51.
Старый 25.04.2011, 16:20
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 8  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Ок... во-первых, удаляет ссылка на объект, а не объект.
и у вот "тайное" устройство URLLoader: https://gist.github.com/326911


Последний раз редактировалось BlooDHounD; 25.04.2011 в 20:21.
Старый 25.04.2011, 18:51
surlac вне форума Посмотреть профиль Отправить личное сообщение для surlac Найти все сообщения от surlac
  № 9  
Ответить с цитированием
surlac
 
Аватар для surlac

блогер
Регистрация: Nov 2010
Сообщений: 143
Записей в блоге: 1
Цитата:
Сообщение от silin Посмотреть сообщение
отсутствие ссылок на объект совсем не повод для запуска GC
Вот повод для запуска GC :
Код AS3:
try {
	new LocalConnection().connect('foo');
	new LocalConnection().connect('foo');
} catch (e:Error) {}
Кстати, можете попробовать FlashPreloadProfiler - довольно удобный профайлер для выявления узких мест и утечек.

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

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

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


 


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


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