PDA

Просмотр полной версии : Почему объекты UIComponent не удаляются из памяти?


bssergy
09.07.2012, 17:45
С помощью TheMiner обнаружил, что объекты UIComponent и унаследованные от него, не удаляются из памяти. То есть, созданный с помощью кода new Group() компонент, так и остается в памяти, даже если будет создано несколько десятков экземпляров, при том, что объект даже никуда не добавляется.

alatar
09.07.2012, 18:01
На них остались ссылки.
GC не был вызван.
...

bssergy
09.07.2012, 18:04
Да никаких ссылок! Я просто в конструкторе другого объекта написал строчку:
new Group();
все!
А в TheMiner использование Force Garbage Collector ничего не дает

Добавлено через 8 минут
Использование System.gc(); действительно помогло. Но тогда еще один вопрос, почему при добавлении к объекту листенера, и последующем удалении, не используя weak reference, объект все равно остается в памяти?

alatar
09.07.2012, 18:17
Вы можете выдавать за раз больше информации по вашему вопросу?
Как добавляете?

bssergy
09.07.2012, 18:21
Когда добавляю вот так:
addEventListener("complete", onCompleted, false, 0, true);
и потом
removeEventListener("complete", onCompleted);
тогда объекты удаляются

а вот когда просто:
addEventListener("complete", onCompleted);
и при этом удаляю
removeEventListener("complete", onCompleted);

тогда объекты не удаляются из памяти

alatar
09.07.2012, 18:24
Вы знаете, ваша проблема понятнее не стала. Поверьте, я знаю синтаксис этих методов. Вопрос был где и к какому объекту вы добавляете слушателей.

bssergy
09.07.2012, 18:29
Ну хотя бы к самому себе

alatar
09.07.2012, 18:58
К самому себе в самом себе, должен удалиться.

bssergy
09.07.2012, 20:08
Возможно ли вообще во время исполнения программы отследить, кто держит объект в памяти?

alatar
09.07.2012, 20:12
В адобовском профайлере можно. За остальные не знаю.

bssergy
09.07.2012, 20:51
Спасибо!

djyamato
09.07.2012, 21:09
В адобовском профайлере можно. За остальные не знаю.
Это в билдере? А где там это посмотреть ? Где в профайлере посмотреть кто "держит" слушателями ?

Astraport
10.07.2012, 11:57
Никогда не использовал System.gc();
Стоит ли его юзать между переходами по View в мобильных флексовых приложениях для улучшения производительности?

alatar
10.07.2012, 12:28
Это в билдере? А где там это посмотреть ? Где в профайлере посмотреть кто "держит" слушателями ?
http://help.adobe.com/ru_RU/flashbuilder/using/WSe4e4b720da9dedb5510654d812e4d126514-8000.html#WSbde04e3d3e6474c4-5d72d86212647a7ea30-7ffd
Никогда не использовал System.gc();
Стоит ли его юзать между переходами по View в мобильных флексовых приложениях для улучшения производительности?
Вызов gc ресурсоемкая операция и принудительно вызывать его (если в этом возникла необходимость) нужно в моменты наименьшей нагрузки. Для управления gc можно также использовать System.pauseForGCIfCollectionImminent() (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/System.html#pauseForGCIfCollectionImminent()).

bssergy
10.07.2012, 12:56
Вот еще видео по использованию профайлера в билдере, кому интересно http://vimeo.com/13359564
Спасибо!

Добавлено через 25 часов 40 минут
Следующая проблемма вот в чем. Есть очень большой проект на flex, и когда я запускаю профайлер с опцией Generate object allocation stack traces, чтобы узнать, кто же держыт объекты в памяти, и делаю снимок памяти, то так и не могу дождаться окончания этого процесса. Есть ли какие то еще методы узнать, что держит определенные объекты в памяти?

Добавлено через 29 часов 16 минут
Все, разобрался. По видимому профайлер не без глюком, по этому иногда приходиться по нескольку раз остановить и запустить снова снапшот памяти, если он висит