Выгрузка ByteArray с использованием Actionscript 3

Как принудительно выгрузить 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;
}
1.08.2008 12:30:57
8 ОТВЕТОВ

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

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

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

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

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

33
30.05.2018 15:54:44

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

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

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

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

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

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

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

23
10.07.2014 21:03:46

Посмотрите на эту статью

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
1.08.2008 13:08:59

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

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

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

14
14.10.2012 12:18:19

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

14
11.07.2014 14:58:07

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

Проигрывает ли Flash Player что-то вроде Java, резервирует место в куче и не освобождает его до тех пор, пока приложение не закроется?

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

10
11.07.2014 14:59:16

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

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

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

9
6.10.2008 18:16:34