Löschen Sie alle Verweise auf Objekte, um sicherzustellen, dass die Speicherbereinigung ausgelöst wird.
Die Speicherbereinigung kann nicht direkt in der Release-Version von Flash Player gestartet werden. Um sicherzustellen, dass ein Objekt bei der Speicherbereinigung berücksichtigt wird, löschen Sie alle Verweise auf das Objekt. Beachten Sie, dass der alte
delete
-Operator aus ActionScript 1.0 und 2.0 sich in ActionScript 3.0 anders verhält. Er kann nur verwendet werden, um die dynamischen Eigenschaften eines dynamischen Objekts zu löschen.
Hinweis:
Sie können die Speicherbereinigung direkt in Adobe® AIR® und in der Debugger-Version von Flash Player aufrufen.
Mit dem folgenden Code wird beispielsweise ein Sprite-Verweis auf
null
eingestellt:
var mySprite:Sprite = new Sprite();
// Set the reference to null, so that the garbage collector removes
// it from memory
mySprite = null;
Berücksichtigen Sie, dass ein Objekt nicht unbedingt aus dem Arbeitsspeicher entfernt wird, wenn es auf
null
eingestellt ist. In manchen Fällen wird die Speicherbereinigung nicht ausgeführt, wenn der verfügbare Arbeitsspeicher nicht als niedrig genug eingestuft wird. Das Verhalten der Speicherbereinigung lässt sich nicht mit Sicherheit voraussagen. Die Speicherbereinigung wird nicht durch das Löschen von Objekten, sondern durch die Zuweisung von Arbeitsspeicher ausgelöst. Wenn die Speicherbereinigung ausgeführt wird, werden Diagramme der Objekte gefunden, die noch nicht bereinigt wurden. Inaktive Objekte in den Diagrammen werden erkannt, indem Objekte ermittelt werden, die aufeinander verweisen, aber nicht mehr von der Anwendung verwendet werden. Inaktive Objekte, die auf diese Weise erkannt wurden, werden gelöscht.
Bei großen Anwendungen kann dieser Vorgang die CPU stark beanspruchen und die Leistung sowie die Anwendungsgeschwindigkeit deutlich beeinträchtigen. Reduzieren Sie die Ausführungshäufigkeit der Speicherbereinigung, indem Sie Objekte so oft wie möglich wiederverwenden. Außerdem sollten Sie die Verweise nach Möglichkeit auf Null setzen, damit bei der Speicherbereinigung weniger Zeit zum Suchen der Objekte anfällt. Stellen Sie sich die Speicherbereinigung als eine Art Versicherung vor, und versuchen Sie stets, den Lebenszyklus der Objekte explizit zu verwalten, sofern möglich.
Hinweis:
Wenn der Verweis auf ein Anzeigeobjekt auf Null gesetzt wird, ist nicht gewährleistet, dass das Objekt fixiert wird. Das Objekt belegt auch weiterhin CPU-Ressourcen, bis es der Speicherbereinigung zugeführt wird. Achten Sie darauf, dass das Objekt ordnungsgemäß deaktiviert wurde, bevor Sie seinen Verweis auf
null
setzen.
Die Speicherbereinigung kann mithilfe der
System.gc()
-Methode gestartet werden, die in Adobe AIR sowie in der Debugger-Version von Flash Player zur Verfügung steht. Über den Profiler in Adobe® Flash® Builder™ können Sie die Speicherbereinigung manuell starten. Über die Ausführung der Speicherbereinigung können Sie die Reaktionsweise der Anwendung beobachten und feststellen, ob Objekte korrekt aus dem Arbeitsspeicher gelöscht werden.
Hinweis:
Wenn ein Objekt als Ereignis-Listener verwendet wurde, kann ein anderes Objekt darauf verweisen. In diesem Fall sollten Sie die Ereignis-Listener mithilfe der
removeEventListener()
-Methode entfernen, bevor Sie die Verweise auf
null
setzen.
Die von Bitmaps belegte Arbeitsspeichermenge kann unmittelbar verringert werden. Beispielsweise enthält die BitmapData-Klasse die
dispose()
-Methode. Im nächsten Beispiel wird eine BitmapData-Instanz mit einer Größe von 1,8 MB erstellt. Die aktuell belegte Arbeitsspeichermenge erhöht sich auf 1,8 MB und die
System.totalMemory
-Eigenschaft gibt einen kleineren Wert zurück:
trace(System.totalMemory / 1024);
// output: 43100
// Create a BitmapData instance
var image:BitmapData = new BitmapData(800, 600);
trace(System.totalMemory / 1024);
// output: 44964
Nun wird die BitmapData-Instanz manuell aus dem Arbeitsspeicher entfernt und die Arbeitsspeicherbelegung wird erneut geprüft:
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
Obwohl die
dispose()
-Methode die Pixel aus dem Arbeitsspeicher entfernt, muss der Verweis auf
null
eingestellt werden, um eine vollständige Freigabe zu erzielen. Wenn ein BitmapData-Objekt nicht mehr benötigt wird, sollten Sie immer die
dispose()
-Methode aufrufen und den Verweis auf
null
einstellen, um den Arbeitsspeicher unmittelbar freizugeben.
Hinweis:
Ab Flash Player 10.1 und AIR 1.5.2 steht eine neue Methode namens
disposeXML()
für die System-Klasse zur Verfügung. Mit dieser Methode können Sie ein XML-Objekt sofort für die Speicherbereinigung zur Verfügung stellen, indem Sie die XML-Struktur als Parameter übergeben.