Question

Comment puis-je décharger de force un ByteArray de 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;
}

Pas de solution correcte

Autres conseils

Je ne pense pas que tu aies de quoi t'inquiéter.Si System.totalMemory descend, 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 consomme 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 à la place pour l'autre processus.

Si j'ai bien compris, la gestion de la mémoire dans les systèmes d'exploitation modernes n'est pas intuitive du point de vue des quantités allouées à chaque processus, ni même de la quantité totale allouée.

Lorsque j'utilise mon Mac pendant 5 minutes, 95 % de mes 3 Go de RAM sont utilisés, et cela restera ainsi, cela ne diminuera jamais.C'est exactement ainsi que le système d'exploitation gère la mémoire.

Tant que cela n'est pas nécessaire ailleurs, même les processus qui se sont arrêtés se voient toujours attribuer de la mémoire (cela peut les rendre plus rapides la prochaine fois, par exemple).

(Je ne suis pas sûr de cela, 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 le souhaite (généralement pas à moins qu'il y ait une raison de l'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 collecte de déchets (comme C# et Java également).

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

Vous pouvez forcer une collecte des ordures, même si vous ne devriez vraiment pas le faire.Si c'est le cas, faites-le uniquement à titre de test...si vous le faites en production, vous nuirez bien 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.

Jetez un oeil à cet article

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

Programmeur ActionScript IANA, mais le sentiment que j'ai est que, parce que le garbage collector peut ne pas s'exécuter quand vous le souhaitez.

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

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

System.totalMemory vous donne la quantité totale de mémoire "utilisée", non allouée.Il est exact que votre application n’utilise peut-être que 20 Mo, mais elle dispose de 5 Mo gratuits pour les allocations futures.

Je ne sais pas si la documentation Adobe ferait la lumière sur la façon dont il gère la mémoire...

Malheureusement, lorsqu'il s'agit de gestion de la mémoire dans Flash/Actionscript vous 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 un ByteArray variable, 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 est allouée.

Ainsi, si je charge, disons, 20 Mo depuis MySQL, dans le Gestionnaire des tâches, la RAM de l'application augmente d'environ 25 Mo.Ensuite, lorsque je ferme la connexion et que j'essaie de supprimer le ByteArray, la RAM ne se libère jamais.Cependant, si j'utilise System.totalMemory, Flash Player indique 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-t-il de l'espace de stockage et ne le libère-t-il pas jusqu'à ce que l'application se ferme ?

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

Ainsi, si je charge, disons, 20 Mo depuis MySQL, dans le Gestionnaire des tâches, la RAM de l'application augmente d'environ 25 Mo.Ensuite, lorsque je ferme la connexion et que j'essaie de supprimer le ByteArray, la RAM ne se libère jamais.Cependant, si j'utilise System.totalMemory, Flash Player indique 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 qu'affiche System.totalMemory.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top