arrays - Descarregando um ByteArray usando o Actionscript 3




actionscript-3 apache-flex (6)

Como descarrego à força um ByteArray da memória usando o ActionScript 3?

Eu tentei o seguinte:

// 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;
}

Então, se eu carregar, digamos, 20 MB do MySQL, no Gerenciador de Tarefas, a RAM do aplicativo aumenta cerca de 25 MB. Então, quando fecho a conexão e tento descartar o ByteArray, a RAM nunca é liberada. No entanto, se eu usar System.totalMemory, o flash player mostra que a memória está sendo liberada, o que não é o caso.

O jogador está "liberando" a memória. Se você minimizar a janela e restaurá-la, verá que a memória agora está muito mais próxima do que o System.totalMemory mostra.

Você também pode estar interessado em usar as ferramentas de perfil do FlexBuilder, que podem mostrar se você realmente tem vazamentos de memória.


Então, se eu carregar, digamos, 20 MB do MySQL, no Gerenciador de Tarefas, a RAM do aplicativo aumenta cerca de 25 MB. Então, quando fecho a conexão e tento descartar o ByteArray, a RAM nunca é liberada. No entanto, se eu usar System.totalMemory, o flash player mostra que a memória está sendo liberada, o que não é o caso.

O flash player está fazendo algo como Java e reservando espaço de heap e não o liberando até que o aplicativo seja encerrado?

Bem, sim e não, como você já deve ter lido em inúmeros posts do blog, o GC no AVM2 é otimista e funcionará de maneira misteriosa. Portanto, funciona um pouco como Java e tenta reservar espaço de heap, no entanto, se você deixar o tempo suficiente e começar a executar outras operações que estão consumindo alguma memória significativa, liberará o espaço anterior. Você pode ver isso usando o criador de perfil durante a noite com alguns testes em execução no seu aplicativo.


Acho que você não tem nada com que se preocupar. Se System.totalMemory ficar inativo, você poderá relaxar. Pode muito bem ser o sistema operacional que não recupera a memória recém-liberada (antecipando a próxima vez que o Flash Player solicitar mais memória).

Tente fazer outra coisa que consome muita memória e tenho certeza de que você perceberá que a memória alocada ao Flash Player diminuirá e será usada no outro processo.

Pelo que entendi, o gerenciamento de memória nos sistemas operacionais modernos não é intuitivo da perspectiva de observar os valores alocados para cada processo, ou mesmo o valor total alocado.

Quando eu uso o meu Mac por 5 minutos, 95% da minha RAM de 3 GB é usada e permanece assim, nunca diminui. É assim que o sistema operacional lida com a memória.

Desde que não seja necessário em outro lugar, mesmo processos que foram encerrados ainda terão memória atribuída a eles (isso pode torná-los mais rápidos na próxima vez, por exemplo).


Dê uma olhada neste artigo

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

Programador de scripts de ação da IANA, no entanto, o que estou sentindo é que, porque o coletor de lixo pode não ser executado quando você desejar.

Daí http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Então, eu recomendo experimentar o código de coleção e ver se isso ajuda

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

Infelizmente, quando se trata de gerenciamento de memória no Flash / actionscript , não há muito o que você possa fazer. O ActionScript foi projetado para ser fácil de usar (para que eles não quisessem que as pessoas se preocupassem com o gerenciamento de memória)

A seguir, uma solução alternativa, em vez de criar uma variável ByteArray , tente isso.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

Onde byteArray é uma propriedade dinâmica de byteObject , você pode liberar a memória que foi alocada para ele.






apache-flex