Разгрузка ByteArray с помощью Actionscript 3

Как я сильно разгружаю a ByteArray из памяти с помощью ActionScript 3?

Я попробовал следующее:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
83
задан Rann Lifshitz 30 May 2018 в 15:53
поделиться

7 ответов

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

Попытка, делающая что-то еще, что является очень интенсивно использующим память и я уверен, что Вы заметите, что память, выделенная Flash player, уменьшится и использоваться для другого процесса вместо этого.

, Поскольку я понял его, управление памятью в современной ОС не интуитивно с точки зрения рассмотрения сумм, выделенных каждому процессу, или даже выделенной общей сумме.

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

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

33
ответ дан Rann Lifshitz 24 November 2019 в 08:54
поделиться

(Я не положителен в этом, но...)

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

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

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

Для принуждения GC попробуйте (да, дважды):

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

можно читать больше здесь .

23
ответ дан HopelessN00b 24 November 2019 в 08:54
поделиться

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

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

программист ActionScript IANA, однако чувство, которое что я получаю, состоит в том, что, потому что сборщик "мусора" не мог бы работать, когда Вы хотите его к.

Следовательно 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();
}
18
ответ дан Jax 24 November 2019 в 08:54
поделиться

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

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

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

14
ответ дан Paul Fleming 24 November 2019 в 08:54
поделиться

К сожалению, когда дело доходит до управления памятью в Flash/actionscript там не много, можно сделать. ActionScript был разработан для EA (таким образом, они не хотели, чтобы люди должны были волноваться об управлении памятью)

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

14
ответ дан Sid M 24 November 2019 в 08:54
поделиться

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

Flash player делает что-то как Java и резервирует пространство "кучи" и не выпускает его до выходов приложения?

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

10
ответ дан Sid M 24 November 2019 в 08:54
поделиться

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

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

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

9
ответ дан 24 November 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: