Подтвердить что ты не робот

Выгрузка ByteArray с помощью ActionScript 3

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

Я пробовал (без успеха):

byteArray.length = 0;
byteArray = new ByteArray();

И

for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
4b9b3361

Ответ 1

Я не думаю, что тебе есть о чем беспокоиться. Если System.totalMemory падает, вы можете расслабиться. Вполне возможно, что ОС не вернет освобожденную память (в ожидании того, что в следующий раз Flash Player запросит больше памяти). Попробуйте сделать что-то еще, что очень интенсивно, и я уверен, что вы заметите, что память, выделенная для Flash Player, уменьшится и будет использоваться для другого процесса.

Как я понял, управление памятью в современной ОС не является интуитивным с точки зрения рассмотрения сумм, выделяемых каждому процессу, или даже общей суммы. Когда я использовал свой Mac в течение 5 минут, 95% моей 3-ГБ ОЗУ используется, и он останется таким, он никогда не опускается. Это то, как ОС управляет памятью. До тех пор, пока в других местах не требуется даже тех процессов, которые ушли, все еще есть память, назначенная им (это может заставить их запускаться быстрее в следующий раз, например).

Ответ 2

(Я не уверен в этом, но...)

AS3 использует не детерминированную сборку мусора. Это означает, что незафиксированная память будет высвобождаться всякий раз, когда среда выполнения кажется ей такой (как правило, нет, если нет причины для запуска, поскольку это дорогостоящая операция для выполнения). Это тот же подход, который используется большинством современных сборщиков мусора (например, С# и Java).

Предполагая, что нет других ссылок на память, на которые указывает byteArray или элементы внутри самого массива, память будет освобождена в какой-то момент после выхода из области, в которой объявлен byteArray.

Вы можете заставить сборку мусора, хотя вы действительно этого не должны. Если вы это сделаете, сделайте это только для тестирования... если вы сделаете это на производстве, вы повредите производительность намного больше, чем сможете помочь.

Чтобы заставить GC, попробуйте (да, дважды):

flash.system.System.gc();
flash.system.System.gc();

Вы можете прочитать больше здесь.

Ответ 3

Взгляните на эту статью

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 > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}

Ответ 4

К сожалению, когда дело доходит до управления памятью в 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, вы можете освободить выделенную для него память.

Ответ 5

Я считаю, что вы ответили на свой вопрос...

System.totalMemory дает вам общий объем используемой памяти, а не выделен. Точно, что ваше приложение может использовать только 20 МБ, но у него есть 5 МБ, что бесплатно для будущих ассигнований.

Я не уверен, что документы Adobe будут проливать свет на то, как он управляет памятью.

Ответ 6

Итак, если я скажу, что 20 МБ от MySQL, в Диспетчере задач ОЗУ для приложения увеличивается примерно на 25 МБ. Затем, когда я закрываю соединение и пытаюсь утилизировать ByteArray, RAM никогда не освобождается. Однако, если я использую System.totalMemory, флеш-плеер показывает, что память освобождается, что не так.

Является ли флеш-плеер делать что-то вроде Java и резервировать кучу пространства и не отпускать его, пока приложение не завершится?

Ну да и нет, поскольку вы, возможно, читали из бесчисленных блог-постов, GC в AVM2 оптимистично настроены и будут работать в своих таинственных целях. Таким образом, он немного похож на Java и пытается зарезервировать кучу пространства, однако, если вы позволите ему достаточно долго и начать делать другие операции, которые потребляют значительную память, это освободит предыдущее пространство. Вы можете увидеть это, используя профайлер в течение ночи с некоторыми тестами, запущенными поверх вашего приложения.

Ответ 7

Итак, если я скажу, что 20 МБ от MySQL, в Диспетчере задач ОЗУ для приложения увеличивается примерно на 25 МБ. Затем, когда я закрываю соединение и пытаюсь утилизировать ByteArray, RAM никогда не освобождается. Однако, если я использую System.totalMemory, флеш-плеер показывает, что память освобождается, что не так.

Игрок "освобождает" память. Если вы минимизируете окно и восстанавливаете его, вы должны увидеть, что memeory теперь намного ближе к тому, что показывает System.totalMemory.

Вам также может быть интересно использовать инструменты профилирования FlexBuilder, которые могут показать вам, действительно ли у вас утечка памяти.