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

голоса
72

Как принудительно выгрузить 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;
}
Задан 01/08/2008 в 13:30
источник пользователем
На других языках...                            


8 ответов

голоса
29

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

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

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

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

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

Ответил 14/08/2008 в 18:05
источник пользователем

голоса
19

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

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

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

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

Для того, чтобы заставить GC, попробовать (да, дважды):

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

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

Ответил 01/08/2008 в 14:08
источник пользователем

голоса
15

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

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();
}
Ответил 01/08/2008 в 14:08
источник пользователем

голоса
13

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

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

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

Ответил 01/08/2008 в 15:03
источник пользователем

голоса
13

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

Ответил 01/08/2008 в 14:14
источник пользователем

голоса
9

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

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

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

Ответил 17/09/2008 в 11:09
источник пользователем

голоса
7

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

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

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

Ответил 06/10/2008 в 19:16
источник пользователем

Ответил 24/07/2014 в 05:48
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more