Сведения о вопросе

Kimsanov

16:03, 1st July, 2020

Теги

arrays   actionscript-3   flex    

Разгрузка ByteArray используя Actionscript 3

Просмотров: 487   Ответов: 8

Как я могу принудительно выгрузить 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;
}



  Сведения об ответе

DAAA

18:03, 1st July, 2020

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

Попробуйте сделать что-то еще, что очень интенсивно потребляет память, и я уверен, что вы заметите, что память, выделенная для Flash Player, уменьшится и будет использоваться для другого процесса.

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

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

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


  Сведения об ответе

DINO

18:03, 1st July, 2020

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

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

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

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

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

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

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


  Сведения об ответе

KOMP

18:03, 1st July, 2020

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

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();
}


  Сведения об ответе

lats

18:03, 1st July, 2020

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


  Сведения об ответе

#hash

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

PROGA

18:03, 1st July, 2020

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

Может ли игрок flash делать что-то вроде Java и резервировать место в куче и не выпускать его до тех пор, пока приложение не выйдет?

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


  Сведения об ответе

$DOLLAR

18:03, 1st July, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться