Liberación de memoria

Elimine todas las referencias a los objetos para garantizar que se active la recolección de elementos no utilizados.

No se puede iniciar el recolector de elementos no utilizados directamente en la versión oficial de Flash Player. Para garantizar que un objeto se recolecta como elemento no utilizado, elimine todas las referencias al objeto. Se debe tener en cuenta que el anterior operador delete utilizado en ActionScript 1.0 y 2.0 se comporta de forma distinta en ActionScript 3.0. Únicamente puede utilizarse para eliminar las propiedades dinámicas en un objeto dinámico.

Nota: es posible llamar al recolector de objetos directamente en Adobe® AIR® y en la versión de depuración de Flash Player.

Por ejemplo, el siguiente código establece una referencia a Sprite en null :

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

Recuerde que cuando un objeto se define como null , no se elimina necesariamente de la memoria. En ocasiones, el recolector de elementos no utilizados no se ejecuta, si la memoria disponible no se considera lo suficientemente baja. El recolector de elementos no utilizados no es previsible. La asignación de memoria, en lugar de la eliminación del objeto, activa la recolección de elementos no utilizados. Cuando se ejecuta el recolector de elementos no utilizados, busca gráficos de objetos que aún no se han recopilado. Detecta objetos inactivos en los gráficos buscando objetos que se hacen referencia entre sí, pero que la aplicación ya no utiliza. Los objetos inactivos detectados de este modo se eliminan.

En las aplicaciones de gran tamaño, este proceso puede implicar una carga para los recursos de CPU y puede afectar al rendimiento, así como implicar una ralentización evidente en la aplicación. Intente limitar el uso de la recolección de elementos no utilizados, reutilizando objetos siempre que sea posible. Asimismo, establezca referencias a null, si es posible, de modo que el recolector de elementos no utilizados emplee menos tiempo de procesamiento en la búsqueda de objetos. Considere el recolector de elementos no utilizados como recurso adicional e intente administrar la duración de los objetos de forma explícita.

Nota: definir una referencia a un objeto de visualización como null no garantiza que dicho objeto se bloquee. El objeto sigue consumiendo ciclos de CPU hasta que se recogen los elementos no utilizados. Asegúrese de que ha desactivado correctamente el objeto antes de definir su referencia como null .

El recolector de elementos no utilizados se puede iniciar utilizando el método System.gc() , disponible en Adobe AIR y en la versión de depuración de Flash Player. El generador de perfiles incluido con Adobe® Flash® Builder permite iniciar el recolector de elementos no utilizados de forma manual. La ejecución del recolector de elementos no utilizados permite ver el modo en que responde la aplicación y si los objetos se eliminan correctamente de la memoria.

Nota: si un objeto se ha utilizado como detector de eventos, otro objeto puede hacer referencia al mismo. Si es así, elimine los detectores de eventos utilizando el método removeEventListener() antes de establecer las referencias a null .

Afortunadamente, la cantidad de memoria utilizada por los mapas de bits puede reducirse al instante. Por ejemplo, la clase BitmapData incluye un método dispose() . En el ejemplo siguiente se crea una instancia de BitmapData de 1,8 MB. La memoria actual en uso crece 1,8 MB y la propiedad System.totalMemory devuelve un pequeño valor:

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

A continuación, BitmapData se borra manualmente (se elimina) de la memoria y el uso de memoria se vuelve a comprobar una vez más:

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 

Aunque el método dispose() elimina los píxeles de la memoria, la referencia aún se debe establecer en null para liberarla por completo. Llame siempre al método dispose() y establezca la referencia en null cuando ya no necesite el objeto BitmapData; de este modo, la memoria se libera de inmediato.

Nota: Flash Player 1.5.2 y AIR 1.5.2 introducen un nuevo método denominado disposeXML() en la clase System. Este método permite hacer que un objeto XML esté disponible de forma inmediata para la recolección de elementos no utilizados, transmitiendo el árbol XML como parámetro.