Décharger un ByteArray avec Actionscript 3

Comment puis-je décharger de force un ByteArray de la mémoire à l'aide d'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;
}
请先 登录 后评论

4 réponses

Karl Seguin

(Je ne suis pas sûr de cela, mais...)

AS3 utilise une récupération de place non déterministe. Ce qui signifie que la mémoire non référencée sera libérée chaque fois que l'exécution 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 que celle utilisée par la plupart des langages modernes de récupération de place (comme C

请先 登录 后评论
Redbaron

Malheureusement, en ce qui concerne la 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 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.

请先 登录 后评论
Theo

Je ne pense pas que vous ayez à vous 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 utilise 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.

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, ou même de la quantité totale allouée.

Lorsque j'ai utilisé mon Mac pendant 5 minutes, 95 % de mes 3 Go de RAM sont utilisés, et cela restera ainsi, il ne s'éteindra jamais. C'est juste la façon dont le système d'exploitation gère la mémoire.

Tant qu'il n'est pas nécessaire ailleurs, même les processus qui se sont arrêtés ont encore de la mémoire qui leur est attribuée (cela peut les accélérer la prochaine fois, par exemple).

请先 登录 后评论
Pedro

Donc, si je charge, disons, 20 Mo à partir de 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, le lecteur flash 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 tas et ne le libère-t-il pas tant que l'application ne 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 manière mystérieuse. Donc, cela fonctionne un peu comme Java et essaie de réserver de l'espace sur le tas, mais si vous le laissez assez longtemps et commencez à faire d'autres opérations qui consomment beaucoup de mémoire, cela libérera cet espace précédent. Vous pouvez le voir en utilisant le profileur pendant la nuit avec des tests exécutés sur votre application.

请先 登录 后评论