Pergunta

Como faço para descarregar à força um ByteArray da memória usando 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;
}

Nenhuma solução correta

Outras dicas

Eu não acho que você tenha nada com que se preocupar.Se System.totalMemory desce você pode relaxar.Pode muito bem ser o sistema operacional que não recupera a memória recém-liberada (em antecipação à próxima vez que o Flash Player solicitará mais memória).

Tente fazer outra coisa que consuma muita memória e tenho certeza que você notará que a memória alocada para o Flash Player diminuirá e será usada para outro processo.

Pelo que entendi, o gerenciamento de memória em sistemas operacionais modernos não é intuitivo do ponto de vista de observar as quantidades alocadas para cada processo, ou mesmo a quantidade total alocada.

Quando uso meu Mac por 5 minutos, 95% dos meus 3 GB de RAM são usados, e ele permanecerá assim, nunca falhará.É assim que o sistema operacional lida com a memória.

Desde que não seja necessário em outro lugar, mesmo os processos que foram encerrados ainda terão memória atribuída a eles (isso pode fazer com que sejam iniciados mais rapidamente na próxima vez, por exemplo).

(Não tenho certeza sobre isso, mas...)

AS3 usa uma coleta de lixo não determinística.O que significa que a memória não referenciada será liberada sempre que o tempo de execução desejar (normalmente, a menos que haja um motivo para executar, já que é uma operação cara de executar).Esta é a mesma abordagem usada pela maioria das linguagens modernas de coleta de lixo (como C# e Java também).

Supondo que não haja outras referências à memória apontada por byteArray ou os itens dentro do próprio array, a memória será liberada em algum momento após você sair do escopo onde byteArray é declarado.

Você pode forçar uma coleta de lixo, embora não deva.Se fizer isso, faça-o apenas para testar...se você fizer isso na produção, prejudicará muito mais o desempenho do que o ajudará.

Para forçar um GC, tente (sim, duas vezes):

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

Você pode ler mais aqui.

Dê uma olhada neste artigo

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

Programador de actionscript da IANA, porém a sensação que estou tendo é essa, porque o coletor de lixo pode não ser executado quando você deseja.

Por issohttp://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();
}

Acredito que você tenha respondido sua própria pergunta...

System.totalMemory fornece a quantidade total de memória que está sendo "usada", não alocada.É verdade que seu aplicativo pode estar usando apenas 20 MB, mas possui 5 MB gratuitos para alocações futuras.

Não tenho certeza se os documentos da Adobe esclareceriam como ele gerencia a memória ...

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

A seguir está uma solução alternativa, em vez de criar um ByteArray variável 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 alocada para ele.

Então, se eu carregar, digamos, 20 MB do MySQL, no Gerenciador de Tarefas a RAM do aplicativo aumentará cerca de 25 MB.Então, quando fecho a conexão e tento descartar o ByteArray, a RAM nunca é liberada.Porém, 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ê deve ter lido em inúmeras postagens de blog, o GC no AVM2 é otimista e funcionará de maneira misteriosa.Portanto, ele funciona um pouco como Java e tenta reservar espaço de heap; no entanto, se você deixar isso por tempo suficiente e começar a fazer outras operações que estão consumindo alguma memória significativa, isso 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.

Então, se eu carregar, digamos, 20 MB do MySQL, no Gerenciador de Tarefas a RAM do aplicativo aumentará cerca de 25 MB.Então, quando fecho a conexão e tento descartar o ByteArray, a RAM nunca é liberada.Porém, 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 System.totalMemory mostra.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top