arrays - Déchargement d'un ByteArray à l'aide d'Actionscript 3

Translate

Comment décharger de force unByteArrayde la mémoire en utilisant ActionScript 3?

J'ai essayé ce qui suit:

// 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;
}
This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je ne pense pas que vous ayez de quoi vous inquiéter. SiSystem.totalMemorydescend, vous pouvez vous détendre. Il se peut que ce soit le système d'exploitation qui 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 systèmes d'exploitation modernes n'est pas intuitive du point de vue des montants alloués à chaque processus, ou même du montant total alloué.

Lorsque j'utilise mon Mac pendant 5 minutes, 95% de ma RAM de 3 Go est utilisée, et cela restera ainsi, il ne tombera jamais en panne. 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 attribuée (cela peut les faire démarrer plus rapidement la prochaine fois, par exemple).

La source
Translate

(Je ne suis pas sûr de ça, 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 envie (généralement pas à moins qu'il y ait une raison de s'exécuter, car c'est une opération coûteuse à exécuter). Il s'agit de la même approche utilisée par la plupart des langages modernes de récupération de place (comme C # et Java également).

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

Vous pouvez forcer un garbage collection, bien que vous ne devriez vraiment pas. Si vous le faites, faites-le uniquement pour les tests ... si vous le faites en production, vous nuirez beaucoup plus aux performances que vous ne les aiderez.

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

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

Vous pouvez lire plus ici.

La source
Jax
Translate

Jetez un œil à cet article

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

Programmeur d'actionscript IANA, mais le sentiment que j'éprouve est le suivant, car le ramasse-miettes peut ne pas fonctionner quand vous le souhaitez.

Par conséquenthttp://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Je vous recommande donc d'essayer leur code de collection et de 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();
}
La source
Translate

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

System.totalMemoryvous donne la quantité totale de mémoire "utilisée", non allouée. Il est exact que votre application n'utilise que 20 Mo, mais 5 Mo sont gratuits pour les allocations futures.

Je ne suis pas sûr que les documents Adobe éclairent la façon dont il gère la mémoire ...

La source
Translate

Malheureusement, en ce qui concerne la gestion de la mémoire dansFlash / actionscriptvous ne pouvez pas faire grand-chose. ActionScript a été conçu pour être facile à utiliser (ils ne voulaient donc pas que les gens aient à se soucier de la gestion de la mémoire)

Ce qui suit est une solution de contournement, au lieu de créer unByteArrayvariable essayez ceci.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

byteArrayest une propriété dynamique debyteObject, vous pouvez libérer la mémoire qui lui a été allouée.

La source
Translate

Donc, si je charge disons 20 Mo à partir de MySQL, dans le gestionnaire de tâches, la RAM de l'application augmente d'environ 25 Mo. Ensuite, lorsque je ferme la connexion et que j'essaye de supprimer ByteArray, la RAM ne se 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.

Le lecteur Flash fait-il quelque chose comme Java et réserve de l'espace sur le tas et ne le libère-t-il pas tant que l'application ne se ferme pas?

Eh bien oui et non, comme vous l'avez peut-être lu sur d'innombrables articles de blog, le GC dans AVM2 est optimiste et fonctionnera de ses propres manières mystérieuses. Donc, cela fonctionne un peu comme Java et essaie de réserver de l'espace sur le tas, mais si vous le laissez suffisamment longtemps et commencez à faire d'autres opérations qui consomment une mémoire importante, cela libérera cet espace précédent. Vous pouvez le voir en utilisant le profileur pendant la nuit avec quelques tests exécutés au-dessus de votre application.

La source
York Lee
Translate

Donc, si je charge disons 20 Mo à partir de MySQL, dans le gestionnaire de tâches, la RAM de l'application augmente d'environ 25 Mo. Ensuite, lorsque je ferme la connexion et que j'essaye de supprimer ByteArray, la RAM ne se 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.

Le joueur «libère» la mémoire. Si vous réduisez la fenêtre et la restaurez, vous devriez voir que la mémoire est maintenant beaucoup plus proche de ce que System.totalMemory montre.

Vous pourriez également être intéressé par l'utilisation des outils de profilage de FlexBuilder qui peuvent vous montrer si vous avez vraiment des fuites de mémoire.

La source