Déchargement d'un ByteArray utilisant Actionscript 3

voix
72

Comment puis-je décharger avec force une ByteArrayde la mémoire à l' aide d' ActionScript 3?

Je l'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;
}
Créé 01/08/2008 à 13:30
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
29

Je ne pense pas que vous avez quoi que ce soit à craindre. Si System.totalMemorydescend vous pourrez vous détendre. Il peut très bien être le système d' exploitation qui ne récupère pas la mémoire vient d'être libéré (en prévision de la prochaine fois que Flash Player demandera plus de mémoire).

Essayez de faire quelque chose d'autre qui est très gourmand en mémoire et je suis sûr que vous remarquerez que la mémoire allouée à Flash Player diminuera et être utilisé 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 de regarder les montants alloués à chaque processus, ou même le montant total alloué.

Quand je l'ai utilisé mon Mac pendant 5 minutes à 95% de mon 3 Go de RAM est utilisé, et il le restera, il ne se couche jamais. C'est juste la façon dont le système d'exploitation gère la mémoire.

Tant que ce n'est pas nécessaire ailleurs même les processus qui ont cessé de fumer ont encore la mémoire qui leur sont assignées (cela peut leur faire lancer plus rapidement la prochaine fois, par exemple).

Créé 14/08/2008 à 18:05
source utilisateur

voix
19

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

AS3 utilise une collection d'ordures non déterministe. Ce qui signifie que la mémoire non référencé sera libéré à chaque fois que l'exécution se sent comme il (généralement pas moins qu'il y ait une raison de courir, car il est une opération coûteuse à exécuter). Ceci est la même approche utilisée par la plupart des déchets modernes (comme langues collectées C # et Java ainsi).

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

Vous pouvez forcer une collection d'ordures, mais vous devriez vraiment pas. Si vous le faites, faites-le uniquement pour les tests ... si vous le faites dans la production, vous blessez des performances beaucoup plus que de l'aider.

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

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

Vous pouvez en lire plus ici .

Créé 01/08/2008 à 14:08
source utilisateur

voix
15

Jetez un oeil à cet article

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

IANA programmeur actionscript, mais le sentiment que je reçois est que, parce que le garbage collector pourrait ne pas fonctionner quand vous le souhaitez.

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

Donc, je vous recommande d'essayer leur code de collecte et de voir si elle 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();
}
Créé 01/08/2008 à 14:08
source utilisateur

voix
13

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

System.totalMemoryvous donne la quantité totale de mémoire étant « utilisée », non attribué. Il est exact que votre demande ne peut être en utilisant 20 Mo, mais il a 5MB qui est gratuit pour les futures allocations.

Je ne sais pas si les documents Adobe éclairerait la façon dont il gère la mémoire ...

Créé 01/08/2008 à 15:03
source utilisateur

voix
13

Malheureusement , en matière de gestion de la mémoire dans Flash / actionscript il n'y a pas beaucoup que vous pouvez faire. ActionScript a été conçu pour être facile à utiliser (donc ils ne voulaient pas que les gens ont à se soucier de la gestion de la mémoire)

Ce qui suit est une solution de contournement, au lieu de créer une ByteArrayessayer variable de cela.

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 byteObject, vous pouvez libérer la mémoire qui a été allouée.

Créé 01/08/2008 à 14:14
source utilisateur

voix
9

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

Est-ce le lecteur flash faire quelque chose comme Java et de réserver l'espace de tas et ne le relâcher tant que l'application se ferme?

Eh bien oui et non, comme vous pourriez avoir lu d'innombrables GC dans le blogposts AVM2 est optimiste et il fonctionnera ses propres voies mystérieuses. Donc, il fonctionne un peu comme Java et tente de réserver un espace de tas, si vous laissez assez longtemps et commencer à faire d'autres opérations qui consomment une mémoire importante, il libérera l'espace précédent. Vous pouvez voir cela en utilisant le profileur pendant la nuit avec quelques tests en cours d'exécution sur le dessus de votre application.

Créé 17/09/2008 à 11:09
source utilisateur

voix
7

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

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

Vous pourriez aussi être intéressé à utiliser les outils de profilage de FlexBuilder qui peut vous montrer si vous avez vraiment des fuites de mémoire.

Créé 06/10/2008 à 19:16
source utilisateur


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