Liberare spazio in memoria

Eliminate tutti i riferimenti agli oggetti per assicurarvi che venga attivato il processo di garbage collection.

Non potete avviare il garbage collector direttamente nella versione release di Flash Player. Per assicurarvi che un oggetto venga incluso nel processo di garbage collection, rimuovete tutti i riferimenti a tale oggetto. Tenete presente che il vecchio operatore delete utilizzato in ActionScript 1.0 e 2.0 si comporta diversamente in ActionScript 3.0. Può infatti essere utilizzato solo per eliminare le proprietà dinamiche di un oggetto dinamico.

Nota: potete avviare il garbage collector direttamente in Adobe® AIR® e nella versione debug di Flash Player.

Ad esempio, il codice seguente imposta un riferimento Sprite su null :

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

Ricordate che quando un oggetto è impostato su null , esso non viene necessariamente rimosso dalla memoria. A volte il garbage collector non viene eseguito, se la memoria disponibile non viene considerata sufficientemente ridotta. Il processo di garbage collection non è prevedibile. È l'allocazione della memoria, e non l'eliminazione dell'oggetto, ad attivare il processo di garbage collection. Quando viene eseguito, il garbage collector trova i grafici degli oggetti che non sono ancora stati raccolti e rileva gli oggetti inattivi nei grafici individuando gli oggetti che fanno riferimento gli uni agli altri ma non sono più utilizzati dall'applicazione. Gli oggetti inattivi rilevati in questo modo vengono eliminati.

Nelle applicazioni di grandi dimensioni, questo processo può consumare molte risorse della CPU e condizionare le prestazioni, producendo un rallentamento sensibile dell'applicazione. Cercate di limitare i passaggi del processo di garbage collection riutilizzando il più possibile gli oggetti. Inoltre, impostate i riferimenti su null quando potete, in modo che il garbage collector necessiti di meno tempo di elaborazione per individuarli. Gestite sempre direttamente la vita operativa degli oggetti, quando è possibile, e considerate il processo di garbage collection come una specie di polizza assicurativa.

Nota: l'impostazione di un riferimento a un oggetto di visualizzazione su null non garantisce che l'oggetto venga bloccato. L'oggetto continua a consumare cicli di CPU fino a quando non viene incluso nel processo di garbage collection. Accertatevi di disattivare correttamente l'oggetto prima di impostare il suo riferimento su null .

Il garbage collector può essere avviato mediante il metodo System.gc() , disponibile in Adobe AIR e nella versione di debug di Flash Player. Il profiler fornito con Adobe® Flash® Builder™ permette di avviare manualmente il garbage collector. L'esecuzione del garbage collector vi consente di vedere come la vostra applicazione risponde e se gli oggetti vengono eliminati correttamente dalla memoria.

Nota: se un oggetto è stato utilizzato come listener di eventi, un altro oggetto può farvi riferimento. In tal caso, rimuovete i listener di eventi chiamando il metodo removeEventListener() prima di impostare i riferimenti su null .

Fortunatamente, la quantità di memoria utilizzata dalle bitmap può essere ridotta istantaneamente. Ad esempio, la classe BitmapData include il metodo dispose() . Nell'esempio seguente viene creata un'istanza BitmapData di 1,8 MB. La memoria corrente in uso cresce fino a 1,8 MB e la proprietà System.totalMemory restituisce un valore inferiore:

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

Quindi, la classe BitmapData viene rimossa manualmente dalla memoria e la memoria in uso viene nuovamente verificata:

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 

Anche se il metodo dispose() rimuove i pixel dalla memoria, il riferimento deve comunque essere impostato su null per rilasciarlo completamente. Chiamate sempre il metodo dispose() e impostate il riferimento su null quando non avete più bisogno di un oggetto BitmapData, in modo da liberare immediatamente la memoria.

Nota: Flash Player 10.1 e AIR 1.5.2 introducono un nuovo metodo denominato disposeXML() nella classe System. Questo metodo vi consente di rendere un oggetto XML immediatamente disponibile per il processo di garbage collection, passando la struttura XML come parametro.