Décharger un ByteArray en utilisant Actionscript 3

Comment puis-je décharger de force un ByteArray de la mémoire à l'aide d'ActionScript 3?

J'ai essayé (sans succès):

byteArray.length = 0;
byteArray = new ByteArray();

Et:

for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
0
ajouté édité
Vues: 17

7 Réponses

Jetez un oeil à cet article

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

Programmeur ActionScript IANA, mais le sentiment que je reçois est que, parce que le garbage collector pourrait ne pas fonctionner quand vous le voulez.

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

Donc, je recommande d'essayer leur code de collection et voir si cela aide

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

(Je ne suis pas positif à ce sujet, mais ...)

AS3 utilise un garbage collection non-déterministe. Ce qui signifie que la mémoire non référencée sera libérée chaque fois que le runtime en aura l'impression (généralement, sauf s'il y a une raison de s'exécuter, car c'est une opération coûteuse à exécuter). C'est la même approche que celle utilisée par la plupart des langages de collecte des ordures modernes (comme C# et Java).

En supposant qu'il n'y a pas d'autres références à la mémoire pointée par byteArray ou les éléments dans le tableau lui-même, la mémoire sera libérée à un certain point après avoir quitté la portée où byteArray est déclaré.

Vous pouvez forcer un garbage collection, bien que vous ne devriez pas. Si vous le faites, faites-le seulement pour tester ... si vous le faites en production, vous blesserez beaucoup plus la performance que l'aide.

Pour forcer un GC, essayez (oui, deux fois):

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

You can read more here.

0
ajouté

Malheureusement, quand il s'agit de gestion de la mémoire dans Flash / actionscript , il n'y a pas grand-chose à faire. ActionScript a été conçu pour être facile à utiliser (il ne voulait donc pas que les gens aient à se soucier de la gestion de la mémoire)

Voici une solution de contournement, au lieu de créer une variable ByteArray essayez ceci.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

byteArray est une propriété dynamique de byteObject , vous pouvez libérer la mémoire qui lui a été allouée.

0
ajouté

Je crois que vous avez répondu à votre propre question ...

System.totalMemory gives you the total amount of memory being "used", not allocated. It is accurate that your application may only be using 20mb, but it has 5mb that is free for future allocations.

Je ne suis pas sûr si les docs d'Adobe feraient la lumière sur la façon dont il gère la mémoire ...

0
ajouté

Je ne pense pas que tu aies quelque chose à t'inquiéter. Si System.totalMemory tombe en panne, vous pouvez vous détendre. Il se peut très bien que le système d'exploitation ne récupère pas la mémoire nouvellement libérée (en prévision de la prochaine fois que Flash Player demandera plus de mémoire). Essayez de faire autre chose qui demande beaucoup de mémoire et je suis sûr que vous remarquerez que la mémoire allouée à Flash Player diminuera et sera utilisée pour l'autre processus à la place.

Comme je l'ai compris, la gestion de la mémoire dans les OS modernes n'est pas intuitive du point de vue des montants alloués à chaque processus, ou même du montant total alloué. Quand j'ai utilisé mon Mac pendant 5 minutes, 95% de mes 3 Go de RAM sont utilisés, et ça restera comme ça, ça ne descend jamais. C'est juste la façon dont le système d'exploitation gère la mémoire. Tant que cela n'est pas nécessaire ailleurs, même les processus qui ont quitté ont encore de la mémoire qui leur est affectée (cela peut les faire démarrer plus rapidement la prochaine fois, par exemple).

0
ajouté

Donc, si je charge 20 Mo à partir de MySQL, dans le Gestionnaire des tâches, la RAM de l'application augmente d'environ 25 Mo. Puis quand je ferme la connexion et essaye de disposer le ByteArray, la RAM ne libère jamais. Cependant, si j'utilise System.totalMemory, flash player montre que la mémoire est libérée, ce qui n'est pas le cas.

     

Est-ce que le lecteur flash fait quelque chose comme Java et réserve de l'espace de tas et ne le libère pas jusqu'à ce que l'application se ferme?

Eh bien oui et non, comme vous avez pu le lire d'innombrables blogposts, le GC dans AVM2 est optimiste et travaillera ses propres moyens mystérieux. Cela fonctionne donc un peu comme Java et essaie de réserver de l'espace, mais si vous le laissez assez longtemps et que vous commencez à faire d'autres opérations qui consomment de la mémoire, il libérera cet espace précédent. Vous pouvez voir cela en utilisant le profiler pendant la nuit avec quelques tests en cours d'exécution sur votre application.

0
ajouté