2013-09-08 3 views
1

Я создаю приложение Air, которое из-за рабочего процесса аниматоров должно загружать большое количество внешних файлов swf.У меня есть ошибка утечки памяти/мусора?

Я загружаю их все через объекты FileStream/Loader в процессе загрузки, а затем сохраняю их в объекте для дальнейшего использования.

В тот момент, когда они загружаются, я использую команду gotoAndStop(1), чтобы заставить их остановить цикл (исходные файлы не имеют никаких скриптов).

После процесса загрузки я вижу, что системная память идет медленно, но последовательно вверх. Когда я вручную вызываю сбор мусора с помощью команды System.gc(), память снова очищается.

Если я позволяю приложению работать в течение нескольких часов, кажется, что сборщик мусора не запускается.

Любые идеи, что может быть проблемой? Или я должен просто забыть об этом и просто изредка запускать System.gc() вручную?

Большое спасибо!

+0

Вы должны использовать профилировщик памяти. Если вы не можете, попробуйте добавить 600x600 bitmapdata к экземпляру и создайте код, который инициализирует этот экземпляр, многократно используйте и удаляйте. Легкий трюк, чтобы увидеть, удален ли экземпляр из памяти. Кроме того, читайте о ApplicationDomain, потому что каждый swf может находиться в памяти, а загруженные классы могут не удаляться. – turbosqel

+0

System.gc() может запускаться только в режиме отладки. –

ответ

2

The Garbage Collector будет работать только тогда, когда это необходимо, поэтому вполне возможно, что он пройдет очень долгое время перед запуском (особенно если у вас много доступной оперативной памяти).

Важная вещь: память очищается при ее запуске. Это говорит мне, что у вас нет утечки, так как его можно очистить.

Кроме того, как вы измеряете системную память? Если вы делаете это через Диспетчер задач, на эти цифры на самом деле не следует полагаться.

Я рекомендую Process Explorer. Отметьте вместо этого столбец «Частные байты».

+0

Привет, Alfie, Спасибо за ответ. Для измерения i используйте значение System.totalMemory самого AIR. На стороне MacOS я использую «верх» в терминале. Есть ли информация о том, когда сборщик мусора считает это достойным, чтобы получить там ленивую задницу? ;) Спасибо! – zantafio

+0

Ну, действительно, GC, как правило, просто возникает, когда он заполнен. Хорошим подходом (если вам нужно) является вызов коллекции после изменения основного состояния приложения, а также когда какие-либо блоки пауз/операций не будут вызывать проблемы с пользователем (например, загрузка нового уровня игры). Это похоже на хорошее место, чтобы начать изучать больше: http://www.adobe.com/devnet/actionscript/learning/as3-fundamentals/garbage-collection.html – Alfie

+0

Спасибо Mate! Я ценю вашу помощь. – zantafio

Смежные вопросы