Каковы хорошие методы управления памятью во Flash / as3 - PullRequest
3 голосов
/ 08 апреля 2010

Итак, я хорошо знаком с управлением памятью в Java, C и C ++; однако во флэш-памяти какие конструкции существуют для управления памятью? Я предполагаю, что во флэш-памяти есть виртуальная машина, подобная java, и я предполагаю, что вещи будут собирать мусор, если им присвоено значение null. Я не уверен, если это действительно так. Также есть ли способ форсировать сборку мусора во Flash? Любые другие советы?

Спасибо

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

На очень конкретном замечании: при использовании EventListeners в вашем коде могут произойти утечки памяти. Наиболее распространенный пример, который я видел в учебниках по AS / Flex для добавления слушателей, выглядит следующим образом:

button.addEventListener(MouseEvent.CLICK, doSomething);

Это работает просто отлично, но игнорирует один существенный момент: на слушателя настоятельно ссылаются. Это означает, что когда компонент, содержащий эту кнопку, является GC'd, слушатель сохраняется и сохраняет ссылку на кнопку, то есть она также не будет собрана.

Чтобы смягчить это, вы можете сделать одну из двух вещей:

button.addEventListener(MouseEvent.CLICK, doSomething, false, 0, true);

Здесь - это описание Adobe 3 дополнительных полей. Обратите внимание, что они говорят о сильных ссылках:

Сильная ссылка (по умолчанию) не позволяет вашему слушателю собирать мусор. Слабая ссылка не делает.

Другой вариант заключается в создании деструктора в вашем коде, поэтому, когда компонент, использующий EventListeners, удаляет их перед тем, как разрушить:

button.removeEventListener(MouseEvent.CLICK, doSomething);
3 голосов
/ 08 апреля 2010

Flash-байт-код запускается AVM (виртуальной машиной Actionscript). В общих чертах (и не будучи экспертом по Java или внутренним компонентам Flash Player), я думаю, можно с уверенностью сказать, что модель AVM в некоторой степени аналогична модели JVM (исходный код скомпилирован в байт-код, который выполняется VM; в AVM, по крайней мере, некоторые из них интерпретируются, а некоторые - JIT, скомпилированные в собственный код перед выполнением и т. Д.).

AVM, как вы сказали, является сборщиком мусора, поэтому в основном распределение и освобождение памяти контролируется GC. Когда объект становится недоступным, он получает право на сбор мусора (это не означает, что он будет сразу же собран).

Существует способ принудительно запустить цикл GC, доступный только в отладочной версии плеера, а также взломать, неофициальный и недокументированный, но вы можете найти некоторые ссылки об этом в google (попробуйте GC hack flash LocalConnection или что-то подобное эти строки). Заставить ГК почти всегда плохая идея.

Недавно я наткнулся на этот пост в блоге, который объясняет, как GC работает в некотором роде, со ссылками на исходный код AVM C ++ (эта часть проигрывателя имеет открытый исходный код, так что вы можете проверить его более подробно информация, если вы так склонны). http://jpauclair.net/2009/12/23/tamarin-part-iii-current-garbage-collector-in-flash-10-0/

0 голосов
/ 08 апреля 2010

В дополнение к тому, что уже было получено, рекомендуется использовать такую ​​библиотеку, как Монитор производительности Actionscript Mr Doob , которая будет отображать текущее использование памяти. Полезно для обнаружения и устранения утечек памяти.

...