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.