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.