от
Как принудительно выгрузить
ByteArray
из памяти с помощью ActionScript 3? Я пробовал следующие:
// First non

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

9 Ответы

0 голосов
от
Как принудительно выгрузить
ByteArray
из памяти с помощью ActionScript 3? Я пробовал следующие:
// First non
0 голосов
от
Я не думаю, что у вас есть о чем беспокоиться. Если
System.totalMemory
идет вниз вы можете отдохнуть. Очень может быть, ОС, что не вернуть освобожденную память (в преддверии очередного флэш-плеер запросит больше памяти). Попробуйте сделать что-то еще, что очень интенсивно использующих память и я уверен, что вы заметите, что памяти, выделенной для флеш плеер уменьшится и будет использоваться для других процессов, а не. Как я понял, управления памятью в современных ОС не понятный с точки зрения глядя на суммы, выделенных для каждого процесса, или даже общая сумма, выделяемая. Когда я использовать мой Mac в течение 5 минут используется 95% моих 3 ГБ оперативной памяти, и он будет оставаться таким, он никогда не идет вниз. Вот только как ОС работает с памятью. Пока это не требуется в других местах даже процессов, которые бросили по-прежнему имеют объем памяти, выделенной для них (это может сделать их запуск быстрее, в следующий раз, например).
0 голосов
от
(Я не уверен насчет этого, но...) В AS3 используется недетерминированная сборка мусора. Это означает, что неиспользуемая память будет освобождена, когда во время выполнения чувствуется (обычно нет, если есть причина для запуска, так как это дорогостоящая операция для выполнения). Это тот же подход используется в большинстве современных языков собирали мусор (как C# и Java так же). При отсутствии других ссылок к памяти, на которую указывает
byteArray
или предметы в пределах самого массива, память будет освобождена в какой-то момент после выхода из области, в которой
byteArray
объявляется. Вы можете принудительную сборку мусора, хотя вы действительно не должны. Если вы делаете, это только для тестирования... если вы делаете это в производство, вам будет больно производительности гораздо больше, чем помочь ему. В силу ГК, попробовать (да, дважды):
flash.system.System.gc();
flash.system.System.gc();
Вы можете прочитать больше здесь.
0 голосов
от
Взгляните на эту статью http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html Однако IANA программист на ActionScript, чувство я получаю это, потому что сборщик мусора может не работать, когда вы хотите. Отсюда http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/ Так что я бы рекомендовал опробовать их код и посмотреть, если это помогает
private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(  gcCount
0 голосов
от
Я думаю, вы сами ответили на свой вопрос...
System.totalMemory
дает общий объем памяти, быть "использованными", не выделяется. Это точно, что ваше приложение может ТОЛЬКО используя 20Мб, но 5Мб, свободной для будущих распределений. Я не уверен, если Adobe документы могли бы пролить свет на то, как он управляет памятью...
0 голосов
от
К сожалению, когда дело доходит до управления памятью на Flash/ActionScript и там не много вы можете сделать. ActionScript, который был разработан, чтобы быть простой в использовании (так они не хотели, чтобы люди не придется беспокоиться об управлении памятью) Следующий обходной путь, вместо того, чтобы создавать
ByteArray
переменная попробовать это.
var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;
Где
byteArray
-это динамическое свойство
byteObject
, вы можете освободить память, которая была выделена для него.
0 голосов
от
Так что, если я скажу 20МБ из MySQL, в Диспетчере задач ОЗУ для приложения идет вверх около 25МБ. Потом, когда я закрыть соединение и попробуйте расположить объект ByteArray, оперативную память не освобождает. Однако, если я использую системы.totalMemory, флеш-плеер показывает, что память высвобождается, что это не так. Это флэш-плеер что-то делает, как Java и оставляя кучу пространства и не выпуская ее до тех пор, пока приложение завершает работу? Ну да и нет, как вы могли прочитать из бесчисленных блогах, ГК в avm2-это оптимистичный и будет работать это собственными таинственными способами. Так что все получилось немного похоже на Java и пытается однако оставляют пространство "кучи", если вы позволите ему достаточно долго и начать делать другие операции, которые потребляют значительные память, она будет бесплатной, что предыдущее пространство. Вы можете увидеть это с помощью профайлера на ночь с некоторых тестов на верхней части вашего приложения.
0 голосов
от
Так что, если я скажу 20МБ из MySQL, в Диспетчере задач ОЗУ для приложения идет вверх около 25МБ. Потом, когда я закрыть соединение и попробуйте расположить объект ByteArray, оперативную память не освобождает. Однако, если я использую системы.totalMemory, флеш-плеер показывает, что память высвобождается, что это не так. Игрок "освобождения" память. Если свернуть окно и восстановить его, вы должны увидеть, что перенести сейчас намного ближе к какой системе.totalMemory показывает. Вы также можете быть заинтересованы в использовании инструменты профилирования flexbuilder в, который может показать вам, если у вас действительно есть утечка памяти.
0 голосов
от
...