Libération de mémoire

Supprimez toutes les références aux objets pour activer le déclenchement du nettoyage de la mémoire.

Il est impossible de démarrer directement le nettoyeur de mémoire dans la version commerciale de Flash Player. Pour être certain qu’un objet est collecté par le nettoyeur, supprimez toutes ses références. Rappelez-vous que l’opérateur delete d’ActionScript 1.0 et 2.0 se comporte différemment dans ActionScript 3.0. Il permet uniquement de supprimer des propriétés dynamiques sur un objet dynamique.

Remarque : vous pouvez appeler directement le nettoyeur de mémoire dans Adobe® AIR® et dans la version de débogage de Flash Player.

Le code suivant, par exemple, définit une référence Sprite sur null :

var mySprite:Sprite = new Sprite(); 
 
// Set the reference to null, so that the garbage collector removes  
// it from memory 
mySprite = null;

Un objet défini sur null n’est pas nécessairement supprimé de la mémoire. Il arrive que le nettoyeur de mémoire ne s’exécute pas si la quantité de mémoire disponible est considérée comme suffisante. Le nettoyage de la mémoire est un processus imprévisible. L’affectation de mémoire, et non la suppression d’objets, déclenche le nettoyage de la mémoire. Lorsqu’il s’exécute, il détecte des graphes d’objets qui n’ont pas encore été nettoyés. Il détecte les objets inactifs dans ces graphes en identifiant les objets qui se font référence mais que l’application n’utilise plus, et les supprime.

Dans une application de grande taille, ce processus, qui est susceptible de solliciter fortement l’unité centrale, peut affecter les performances et entraîner un ralentissement notable de l’application. Réutilisez autant que possible les objets pour essayer de réduire le nombre d’exécutions du nettoyeur de mémoire. Définissez également les références sur null, le cas échéant, afin que le nettoyeur consacre moins de temps de traitement à rechercher les objets. Vous pourriez envisager le nettoyage de la mémoire comme une assurance : gérez donc la durée de vie des objets de manière explicite et systématique, dans la mesure du possible.

Remarque : définir une référence à un objet d’affichage sur null ne garantit pas le figement de l’objet. L’objet continue de consommer les ressources de l’unité centrale jusqu’à ce qu’il soit nettoyé. Veillez à désactiver votre objet avant de définir sa référence sur null .

Vous pouvez lancer le nettoyeur de mémoire à l’aide de la méthode System.gc() , que proposent Adobe AIR et la version de débogage de Flash Player. Le profileur livré avec Adobe® Flash® Builder™ permet de lancer manuellement le nettoyeur de mémoire. L’exécution de ce dernier permet de vérifier le comportement de l’application et de déterminer si les objets sont correctement supprimés de la mémoire.

Remarque : tout objet servant d’écouteur d’événements peut être référencé par un autre objet. Dans ce cas, supprimez les écouteurs d’événements à l’aide de la méthode removeEventListener() avant de définir les références sur null .

Il est heureusement possible de réduire instantanément la quantité de mémoire utilisée par les bitmaps. La classe BitmapData, par exemple, possède une méthode dispose() . L’exemple qui suit crée une occurrence de BitmapData de 1,8 Mo. La mémoire utilisée actuellement atteint 1,8 Mo et la propriété System.totalMemory renvoie une valeur inférieure :

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 

L’occurrence de BitmapData est ensuite manuellement supprimée de la mémoire, qui est à nouveau vérifiée :

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 
 
image.dispose(); 
image = null; 
 
trace(System.totalMemory / 1024); 
// output: 43084 

Bien que la méthode dispose() supprime les pixels de la mémoire, il est néanmoins nécessaire de définir la référence sur null pour la libérer totalement. Appelez systématiquement la méthode dispose() et définissez la référence sur null lorsque vous n’avez plus besoin d’un objet BitmapData afin de libérer immédiatement la mémoire.

Remarque : la classe System de Flash Player 10.1 et d’AIR 1.5.2 comporte une nouvelle méthode, disposeXML() . Cette méthode vous permet de mettre immédiatement un objet XML à la disposition du nettoyeur de mémoire, en transmettant l’arborescence XML en tant que paramètre.