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

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

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

Регистрация: Jan 2013
Сообщений: 18
The bomb! Утечка памяти. больше методов решения.

добрый день формучане! тема заезженная, параллельных много, однако решения проблемы найти не удается.

имеется здоровенный проект отображающий дэшборды с данными. между дэшбордами можно переключаться (старый уничтожается, новый грузится по параметрам, тянущимся из бд). данная манипуляция приводит к утечке памяти.

что я делаю:
1. для всех возможных слушателей установил викреференсы.
2. уничтожаю все слушатели по мере уничтожения родителя
3. реализовал для всех потенциальных классов интерфейс IDisposable: чистит объекты, при уничтожении родителя
4. использовал вик референс для вьюх и контроллеров (спасибо http://dtf.ru/articles/read.php?id=51967)
5. прошерстил статичные классы, ссылок на потенциальные объекты нет.
6. профайлил приложение: память забивается! потенциальный объект: DashBoardView. держат его какие то функции, как их найти я не понимаю. (к слову, GC отрабатывает, но объекты не выгружает)

вопросы:
1. какие еще существуют стандартные средства борьбы с утечками
2. могут ли Embed картинки удерживать объект?
3. как узнать, какие же точно функции держат мой объект и не отдают во врата GC на съедение? в аттаче скриншот профайлера и дэшборда с функциями.


p.s. не исключено что я где то не удалил слушатель или ссылку. но проект слишком большой, чтобы перелопачивать его построчно.

заранее спасибо!
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 80
Размер:	109.9 Кб
ID:	28975  

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
7. Убрать _все_ _без исключения_ анонимные функции из проекта - на одном после оной операции потребление памяти упало с 800 до 200 метров. (плюс-минус - я не помню точные цифры уже)

А эти викреференсы - как парашют для экипажа пассажирского лайнера - вроде 2-4 человека спасутся - это лучше, чем все 100 погибнут, но надо ли так мотивировать экипаж спасать пассажиров? Т.е. все эти мягкие ссылки c одной стороны уменьшают пагубные эффекты от утечек, но с другой - маскируют места, где Вы забыли отписаться и возникают уже другие проблемы - со срабатыванием листнера пока его GC не соберёт, хотя он не нужен.

Цитата:
реализовал для всех потенциальных классов интерфейс IDisposable: чистит объекты, при уничтожении родителя
Интересно, как он их чистит? Пример кода просто.

По поводу методов поиска утечек - самый тупой способ - это отключаем подозрительные блоки кода и смотрим что происходит с памятью. Как только получили резкое изменение - начинаем плясать от кода, который отключили.
Например, если есть подозрение, что память течёт из-за объектов на сцене - не надо гадать, просто перестаём их создавать вообще и смотрим что меняется - ничего не меняется? - создаём, но не добавляем на сцену и т.д.

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
для всех возможных слушателей установил викреференсы.
Это ставить себе палки в колеса. Если вы уверены в том, что все ссылки удаляются, то делать удаление недетерминированым по времени - это выстрел себе в коленку, вам только будет сложнее тестировать от этого, но ничего по-существу вы не меняете.
Цитата:
реализовал для всех потенциальных классов интерфейс IDisposable: чистит объекты, при уничтожении родителя
Верните все как было. Это самое неудачное, что только можно придумать в рантайме с управляемой памятью, особенно, принимая во внимание то, что у вас нет настоящих ссылок на объекты. Вы хотите написать свой ГЦ с блек джеком и нянями-массажистками? И при этом не можете решить проблемы ГЦ уже существующего? Попробуйте реалистичнее оценить ваши шансы на успех.

Что мы видим на картинке? Это ситуация когда возникла ошибка out of memory? Пока вы не получите out of memory, или аналогичную / сопутствующую ошибку утечка памяти не доказана / не установлена. Может просто вашей программе действительно нужно больше ресурсов.
Даже после того, как вы получите соответствующую ошибку, нужно проанализировать ситуацию. Не каждая такая ошибка свидетельствует об неправильно используемой памяти. Возможно, вашей программе нужно больше ресурсов - и вам нужно пересмотреть стратегию получения ресурсов, но никак не очистку.

Существуют типичные причины, где, зачастую, могут произойти утечки. Например, не остановленный Timer никогда не освободит память, даже если все ссылки на него в пользовательском коде уничтожены. Вообще все события такого плана - потенциальные подозреваемые.
LocalConnection так же, если его явно не уничтожать, может привести к подобным результатам. В остальных случаях нужно начинать с анализа пользовательского кода и смотреть на то как часто создаются и уничтожаются экземпляры выбранного класса. Найти такие, которые не уничтожаются в предполагаемый срок и попытаться установить причину.
__________________
Hell is the possibility of sanity


Последний раз редактировалось iNils; 11.01.2013 в 17:43.
Старый 11.01.2013, 17:54
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 4  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Цитата:
Цитата:
реализовал для всех потенциальных классов интерфейс IDisposable: чистит объекты, при уничтожении родителя
Верните все как было. Это самое неудачное, что только можно придумать в рантайме с управляемой памятью, особенно, принимая во внимание то, что у вас нет настоящих ссылок на объекты. Вы хотите написать свой ГЦ с блек джеком и нянями-массажистками? И при этом не можете решить проблемы ГЦ уже существующего? Попробуйте реалистичнее оценить ваши шансы на успех.
Чего? А как же рекомендации типа: "если вы хотите, что ГЦ отчистил память от объекта, то отпишите все слушатели, занулите все ссылки на другие объекты". Ну и как моему объекту определить, что вот оно, "пришло твое время". На мой взгляд только так - вызовом какой-нибудь функции destroy из интерфейса IDestructable. Какие еще варианты?
__________________
мой пустой блог

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Верните все как было. Это самое неудачное, что только можно придумать в рантайме с управляемой памятью, особенно, принимая во внимание то, что у вас нет настоящих ссылок на объекты.
Не могу поверить, что это говорит старожил форума..
Может я не правильно понял ход мысли здесь, но как можно рекомендовать отказ от "уборки за собой"?

Старый 11.01.2013, 19:26
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 6  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
System.disposeXML() еще частенько забывают.
__________________
Поймай яблоко 2!

Старый 11.01.2013, 19:46
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Верните все как было. Это самое неудачное, что только можно придумать в рантайме с управляемой памятью, особенно, принимая во внимание то, что у вас нет настоящих ссылок на объекты
Да не, отписываться то всё равно надо вручную (слабые ссылки это делают с запозданием).
Т.е. коё-чего сделать с некоторым объектом прежде чем забыть о его существовании надо.
(понятно, что если все объекты такие - то GC не имеет смысла, но GC же тоже не волшебник)

Цитата:
чистит объекты, при уничтожении родителя
Т.к. прямого убирания из памяти нет, то очень интересно что автор конкретно понимает под "чистит объекты".
(Зануление ссылок, ссылающихся на уничтожаемый объект в других объектах? Отписку от внешних диспетчеров? Ручной вызов dispose у имеющихся BitmapData и XML? убирание вспомогательных объектов, которые понадобавлены в неотносящиеся к объекту списки и при исчезновении удаляемого объекта тоже должны быть убраны из этих списков?)

Хочется прямо копипасту из этого метода уничтожения, иначе, чую про разные вещи будем говорить.

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Подробнее о том, почему не нужно пытаться своими силами организовать ГЦ:
- у вас технически нет необходимой информации (вы не можете построить граф в котором арками являутся связи "на А ссылаются из Б", либо вам нужно будет все вызовы new заворачивть в функцию, которая будет следить за созданием таких связей. Т.как код ОПа зависит от четрвертого Флекса (килотонны AS3 кода, в которых эта стратегия не применялась), то вы не сможете это правило сделать глобальным - скорее всего пользовательский код не составляет и десяти процентов от всего кода программы.
- У вас технически нет возможности очистить память. Управляемый рантайм потому и управляемый, что напрямую работать с памятью выделенной рантаймом вам никто не даст. Тому есть множество причин, и вдаваться в подробности сейчас нет смысла, но самое главное - это безопасность и возможность рантайма применять какие либо стратегии по работе с памятью не принимая во внимание пользовательский код. Пример (теоретический) такой возможности: вы создали массив на 100000 элементов и положили туда всего 10. Рантайм зная, что вы грязными руками не полезете в память помещать или убирать элементы может себе позволить либо выделять память по мере необходимость, либо разрешить другим объектам использовать выделенную, но пока что не востребованную память. Подобных техник существует множество.
- Добавив код который якобы что-то очищает, вы создаете "шум" - бесполезный текст программы, который затрудняет чтение программы, и располагает к появлению ошибок по причине невнимательности.

Утечка памяти в управляемом рантайме - это проблема в логике кода. Правильный код не может создавать утечки. Следовательно, чтобы нейтрализовать утечку нужно найти и исправить ошибку в пользовательском коде.
Конечно, это правило верно только в том случае, если доказано, что рантайм работает всегда правильно - к сожалению, в рантайме могут быть неинтуитивные моменты, или просто ошибки, которые приводят к утечкам (как уже упоминалось выше - таймер и т.п.), поэтому их тоже нужно проверить.
__________________
Hell is the possibility of sanity

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

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

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

Регистрация: Jul 2008
Сообщений: 912
А скаутом разве нельзя утечку обнаружить?

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

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

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


 


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


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