![]() |
Лики памяти (общее)
Хочу еще раз затронуть тему ликов памяти при выполнении флеш приложения.
Я думаю, что не все программисты проверяют свои разработки на подобные баги или часто используют профайлер? Особенно остро этот вопрос стоит, когда юзается более менее большое приложение и достаточно долго без его перезагрузки. Я довольно часто ощущаю подобные неудобства, работая с различными приложениями, буквально с каждой минуты его работы, заметна разница в падении производительности работы приложения. Все эти неудобства в большинстве случаев вызваны большим количеством динамических событий. Большое число временных объектов подписываются на события, которые ожидают прослушивания, но не дождавшись их, далеко наверху удаляется объект, который содержит в себе все это и не может удалиться из памяти, так как по прежнему ожидает n-ое кол-во прослушиваний. Так как же избежать такой ситуации, когда мы удаляем объект на порядок выше в структуре и не можем (точнее можем, но окольными путями) отписать все его потроха от событий? В каждом классе, где используются динамические события, да и вобще события, от которых нужно отписаться при удалении этого экземпляра я использую следующий простой способ. Код AS3:
Или даже, возможно, я использую велосипед, кто как выходит из положения, можете поделиться опытом? Вопрос я этот поднял потому, что программируя несколько лет и разрабатывая приложения, где лики памяти были ощутимы, эти две строчки кода в тот момент для меня не были очевидными. |
Утечки памяти и их устранение
Нужно писать деструкторы и использовать их по назначению. Ваш метод годится (да и то крайне редко) только для экранных объектов, и я бы сказал, что его польза сомнительна. |
Вопрос такой а если я перезаписываю какую либо переменную новым экземпляром удаляется ли предыдущий объект из памяти?
Код AS3:
|
Когда придет GC, удалится. Однако все обработчики события так и останутся висеть в памяти, их нужно вручную чистить.
|
Еще такой вопрос, если внутри контейнера несколько разных объектов, их тоже надо удалять из списка отображения и обнулять перед тем как обнулить этот контейнер, или достаточно обнулить сам контейнер?
Насчет обработчиков понятно. Если они есть внутри контейнера то отписываемся. |
Лучше обнулить. Но, насколько мне известно, GC неплохо обрабатывает кольцевые ссылки. А вообще, профайлер в руки и вперед пробовать.
|
@Vreden
Безобразие. У вас ошибка в слове "памяти". Правильно писать "лики мемори". Есть хороший русскоязычный термин "утечка". |
Цитата:
Я стараюсь отписаться всегда маниакально от всего, делая деструкторы. |
Подписки на самого себя можно не убирать.
|
Когда проектирую объект стараюсь тщательно продумывать его инициализацию и уничтожение, а от событий стараюсь отписываться сразу как только появляется возможность. GC вызываю silin-ским скриптиком. А по другому и не возможно, ИМХО, контролировать ресурсы.
|
| Часовой пояс GMT +4, время: 03:38. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.