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.