A descarga de uma ByteArray usando Actionscript 3

votos
72

Como eu força descarregar uma ByteArraymemória de usar 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;
}
Publicado 01/08/2008 em 13:30
fonte usuário
Em outras línguas...                            


8 respostas

votos
29

Eu não acho que você tem nada para se preocupar. Se System.totalMemoryvai para baixo você pode relaxar. Pode muito bem ser o SO que não recuperar a memória recém-libertado (em antecipação da próxima vez Flash Player vai pedir mais memória).

Tente fazer outra coisa que é muito intensivo de memória e tenho certeza que você vai perceber que a memória alocada para o Flash Player vai diminuir e ser usadas para o outro processo em seu lugar.

Como eu entendi, gerenciamento de memória em sistemas operacionais modernos não é intuitiva a partir da perspectiva de olhar para os montantes atribuídos a cada processo, ou até mesmo o montante total atribuído.

Quando eu usei o meu Mac por 5 minutos 95% do meu 3 GB RAM é usada, e ele vai ficar desse jeito, ele nunca vai para baixo. Isso é apenas a maneira como o sistema operacional lida com a memória.

Enquanto não é necessário em outros lugares até mesmo processos que pararam ainda tem memória atribuída a eles (isso pode torná-los lançar mais rápido da próxima vez, por exemplo).

Respondeu 14/08/2008 em 18:05
fonte usuário

votos
19

(Eu não sou positivo sobre isso, mas ...)

AS3 usa uma coleta de lixo não-determinista. O que significa que a memória não referenciado será liberado sempre que o tempo de execução se sente como ele (normalmente não menos que haja uma razão para correr, já que é uma operação cara para executar). Esta é a mesma abordagem utilizada pela maioria dos modernos de lixo coletado linguagens (como C # e Java, bem).

Assumindo que não há outras referências à memória apontada por byteArrayou os itens dentro da própria matriz, a memória será liberada em algum momento depois de sair do escopo onde byteArrayé declarada.

Você pode forçar uma coleta de lixo, mas você realmente não deveria. Se você fizer, faça-o apenas para testes ... se você fazê-lo em produção, você vai prejudicar o desempenho muito mais do que ajudá-lo.

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

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

Você pode ler mais aqui .

Respondeu 01/08/2008 em 14:08
fonte usuário

votos
15

Ter um olhar para este artigo

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

IANA programador actionscript, no entanto, o sentimento que eu estou recebendo é que, porque o coletor de lixo pode não funcionar quando você quer que ele.

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

Então, eu recomendo experimentar o seu 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();
}
Respondeu 01/08/2008 em 14:08
fonte usuário

votos
13

Eu acredito que você respondeu a sua própria pergunta ...

System.totalMemorydá-lhe a quantidade total de memória que está sendo "usado", não atribuído. É preciso que a sua aplicação só pode estar usando 20mb, mas tem 5MB que é livre para alocações futuras.

Eu não tenho certeza se os documentos Adobe iria lançar luz sobre a maneira que ele gerencia a memória ...

Respondeu 01/08/2008 em 15:03
fonte usuário

votos
13

Infelizmente, quando se trata de gerenciamento de memória em Flash / ActionScript não há um lote inteiro que você pode fazer. ActionScript foi projetado para ser fácil de usar (para que eles não querem que as pessoas têm de se preocupar com o gerenciamento de memória)

O seguinte é uma solução alternativa, em vez de criar uma ByteArrayvariável tentar 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.

Respondeu 01/08/2008 em 14:14
fonte usuário

votos
9

Então, se eu carregar dizer 20MB a partir do MySQL, no Gerenciador de Tarefas do RAM para a aplicação sobe por cerca de 25MB. Então, quando eu fechar a ligação e tentar eliminar o ByteArray, a RAM não libera. No entanto, se eu usar System.totalMemory, flash player mostra que a memória está sendo liberada, o que não é o caso.

É o flash player fazendo algo como Java e reservando espaço de pilha e não liberá-lo até que o aplicativo é encerrado?

Bem, sim e não, como você pode ter lido a partir de inúmeras blogposts o GC em AVM2 é otimista e vai trabalhar a sua própria maneira misteriosa. Então ele faz trabalhar um pouco como Java e tenta reservar espaço de pilha, no entanto, se você deixar o tempo suficiente e começar a fazer outras operações que estão consumindo alguma memória significativa que irá liberar o espaço anterior. Você pode ver isso usando o profiler durante a noite com alguns testes rodando em cima de seu aplicativo.

Respondeu 17/09/2008 em 11:09
fonte usuário

votos
7

Então, se eu carregar dizer 20MB a partir do MySQL, no Gerenciador de Tarefas do RAM para a aplicação sobe por cerca de 25MB. Então, quando eu fechar a ligação e tentar eliminar o ByteArray, a RAM não libera. No entanto, se eu usar System.totalMemory, 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á-lo você deve ver que o memeory é agora muito mais perto do que mostra System.totalMemory.

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

Respondeu 06/10/2008 em 19:16
fonte usuário


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