Freigeben von Arbeitsspeicher

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.