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

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

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

Регистрация: Oct 2011
Сообщений: 18
По умолчанию Утечка памяти при доступе к Vector

Здравствуйте,

в следующем коде наблюдается утечка памяти:
Код AS3:
 
a = dot[0].x; a = dot[0].y; 
a = dot[1].x; a = dot[1].y; 
a = dot[2].x; a = dot[2].y; 
a = dot[3].x; a = dot[3].y; 
a = dot[4].x; a = dot[4].y;
Если этот фрагмент закомментировать, то утечки нет.
этот код выполняется при срабатывании таймера,
a: Number;
dot: Vector.<RDot> = new Vector.<RDot>();
RDot - пользовательский класс без Set и Get методов,

Если для dot поставить тип Array, то утечка такая же.
Как победить?

Добавлено через 38 минут
Ситуация разрешилась следующим изменением кода для каждого индекса:

Код AS3:
t_rdot = dot[0];
a = t_rdot.x; a = t_rdot.y;
Вопрос остается открытым: почему при чтении свойства dot[4].x из массива происходит утечка памяти?
Это такая фишка AS3?

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Как вы определили утечку? В вашем коде вообще не понятно, являются ли a и dot локальными переменными функции, или полями класса. Существуют ли ссылки на dot помимо этого фрагмента и т.д. Судя по тому, что прозвучало слово "таймер" - таймеры более частая причина проблем связанных с памятью. Их нужно останавливать и отписываться от событий если вы их планируете больше не использовать.
__________________
Hell is the possibility of sanity

Старый 11.10.2011, 13:49
Roman_Konyukhov вне форума Посмотреть профиль Отправить личное сообщение для Roman_Konyukhov Найти все сообщения от Roman_Konyukhov
  № 3  
Ответить с цитированием
Roman_Konyukhov

Регистрация: Oct 2011
Сообщений: 18
Это точно не связано с событиями, если проблемный код закомментировать, то утечка пропадает.
dot - поле класса,
a-пробовал и в поле класса размещать и в функции, утечка от этого не зависит.
утечку определил с помощью System.totalMemery.
На элементы массива dot существуют ссылки в других подобных массивах, утечка может быть с этим связана? (хотя механизм утечки мне не понятен)

Старый 11.10.2011, 14:00
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 4  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
утечку определил с помощью System.totalMemery.
И что это за утечка?
Для флеш плеера абсолютно нормально потребление нескольких лишних мегабайт в течении определенного времени. После срабатывания сборщика мусора память освобождается

Старый 11.10.2011, 14:05
Roman_Konyukhov вне форума Посмотреть профиль Отправить личное сообщение для Roman_Konyukhov Найти все сообщения от Roman_Konyukhov
  № 5  
Ответить с цитированием
Roman_Konyukhov

Регистрация: Oct 2011
Сообщений: 18
Я не считаю это нормальным, и в официальном руководстве от Adobe рекомендуется избегать утечек. Пока ситуация разрешилась. Но хотелось бы понять природу этой утечки.

Старый 11.10.2011, 14:37
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 6  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Вот именно утечек, а не того, что Вы называете этим словом. Сборщик мусора запускается когда ему заблагорассудится, а не после каждой строчки в Вашем коде.

Добавлено через 2 минуты
И почитайте про профайлер и разберитесь, что такое утечка (на википедии есть статья).
__________________
http://www.chessmax.ru

Старый 11.10.2011, 14:44
Roman_Konyukhov вне форума Посмотреть профиль Отправить личное сообщение для Roman_Konyukhov Найти все сообщения от Roman_Konyukhov
  № 7  
Ответить с цитированием
Roman_Konyukhov

Регистрация: Oct 2011
Сообщений: 18
Оказалось, что при периодическом обращении к массиву public var zemy:Vector.<Number> , элементы которого имеют тип Number, происходит постоянное увеличение System.totalMemery.
Разве постоянное увеличение памяти при каждом обращении к элементу массива не является утечкой?
Я так и не понял: возрастание System.totalMemery при каждом чтении элемента любого массива - это нормально?

Старый 11.10.2011, 14:45
botbot вне форума Посмотреть профиль Отправить личное сообщение для botbot Найти все сообщения от botbot
  № 8  
Ответить с цитированием
botbot

Регистрация: Feb 2011
Сообщений: 100
Полный код лучше увидеть, а так сложно сказать. Тем боле это могут быть просто внутренние механизмы флеша при доступе к вот такому индексу. Например, флеш сначала делает dot[0], получает ссылку на объект и запоминает её для оптимизации - отсюда утечка. Вернее это даже не утечка, а временый перерасход памяти, который потом исчезает или используется повторно. Пытаться оптимизировать скриптовый язык и предсказать его поведение на таком низком уровне задача неблагодарная и малополезная.
Так попробуйте ещё:
Код AS3:
a = (dot[0]).x; a = (dot[0]).y; 
a = (dot[1]).x; a = (dot[1]).y;
Или:
Код AS3:
a = dot[0]['x']; a = dot[0]['y']; 
a = dot[1]['x']; a = dot[1]['y'];

Старый 11.10.2011, 14:47
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 9  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Встроенные типы, такие как Number, не передаются по ссылке, по этому флешплеер при обращении создает новую копию каждый раз, вот отсюда (возможно) и увеличение totalMemory.
__________________
http://www.chessmax.ru

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Чтобы доказать, что существует утечка вам нужно получить ошибку #1000 - out of memory. Иначе это все досужие домыслы. В вашем коде нет никаких очевидных признаков, более того, никаких даже более менее понятных признаков того, что именно происходит (вам бы нужно было продемонстривоать как массив / вектор создается, как заполняется, кто к нему осуществляет доступ, и когда объекты из вектора / массива больше не имеют внешних ссылок.
__________________
Hell is the possibility of sanity

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

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

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


 


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


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