2008-08-01 24 views
70

¿Cómo descargo forzosamente un ByteArray de la memoria con ActionScript 3?Descarga de un ByteArray con Actionscript 3

He intentado (sin éxito):

byteArray.length = 0; 
byteArray = new ByteArray(); 

Y:

for (var i:int=0; i < byteArray.length; i++) { 
    byteArray[i] = null; 
} 

Respuesta

15

Tener un vistazo a este artículo

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

Programador de ActionScript de IANA, sin embargo, la sensación que recibo es que, porque el recolector de basura no se ejecuta cuando usted lo desea.

Por lo tanto http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

así que recomiendo probar su código de colección y ver si ayuda

private var gcCount:int; 
private function startGCCycle():void{ 
    gcCount = 0; 
    addEventListener(Event.ENTER_FRAME, doGC); 
} 
private function doGC(evt:Event):void{ 
    flash.system.System.gc(); 
    if(++gcCount > 1){ 
     removeEventListener(Event.ENTER_FRAME, doGC); 
     setTimeout(lastGC, 40); 
    } 
} 
private function lastGC():void{ 
    flash.system.System.gc(); 
} 
19

(no soy positivo acerca de esto, pero ...)

AS3 usa una recolección de basura no determinista. Lo que significa que la memoria sin referencia se liberará siempre que el tiempo de ejecución lo parezca (normalmente no, a menos que exista una razón para ejecutarla, ya que es una operación costosa de ejecutar). Este es el mismo enfoque utilizado por la mayoría de los lenguajes modernos recogidos de basura (como C# y Java también).

Suponiendo que no hay otras referencias a la memoria apuntada por byteArray o los elementos dentro de la matriz en sí, la memoria se liberará en algún momento después de salir del alcance donde se declara byteArray.

Puede forzar una recolección de basura, aunque en realidad no debería. Si lo hace, hágalo solo para probar ... si lo hace en producción, dañará el rendimiento mucho más que ayudarlo.

Para forzar un GC, tratar (sí, dos veces):

flash.system.System.gc(); 
flash.system.System.gc(); 

You can read more here.

13

Desafortunadamente cuando se trata de la administración de memoria en Flash/actionscript no hay mucho que pueda hacer. ActionScript fue diseñado para ser fácil de usar (por lo que no querían que la gente tuviera que preocuparse por la administración de memoria)

La siguiente es una solución, en lugar de crear una variable ByteArray intente esto.

var byteObject:Object = new Object(); 

byteObject.byteArray = new ByteArray(); 

... 

//Then when you are finished delete the variable from byteObject 
delete byteObject.byteArray; 

Dónde byteArray es una propiedad dinámica de byteObject, puede liberar la memoria que se ha asignado para ello.

13

creo que haya respondido a su propia pregunta ...

System.totalMemory le da la cantidad total de memoria que se está "usado", no asignado. Es exacto que su aplicación solo puede usar 20mb, pero tiene 5mb que es gratis para futuras asignaciones.

No estoy seguro de si los documentos de Adobe podrían arrojar luz sobre la forma en que se administra la memoria ...

28

no creo que tenga nada de qué preocuparse. Si System.totalMemory se cae, puede relajarse. Es muy posible que el sistema operativo no reclame la memoria recién liberada (en previsión de la próxima vez que Flash Player solicite más memoria). Intente hacer otra cosa que requiera mucha memoria y estoy seguro de que notará que la memoria asignada a Flash Player disminuirá y se utilizará para el otro proceso.

Como ya lo he entendido, la gestión de memoria en los modernos sistemas operativos no es intuitivo desde la perspectiva de mirar a los importes asignados a cada proceso, o incluso la cantidad total asignada. Cuando uso mi Mac por 5 minutos, se usa el 95% de mis 3 GB de RAM, y seguirá siendo así, nunca baja. Así es como el sistema operativo maneja la memoria. Mientras no sea necesario en otros lugares, incluso los procesos que se han cerrado todavía tienen memoria asignada a ellos (esto puede hacer que se lancen más rápido la próxima vez, por ejemplo).

9

lo tanto, si me carga decir 20MB de MySQL, en el Administrador de tareas de la memoria RAM para la aplicación sube en alrededor de 25 MB. Luego, cuando cierro la conexión y trato de eliminar el ByteArray, la RAM nunca se libera. Sin embargo, si uso System.totalMemory, flash player muestra que la memoria se está liberando, lo que no es el caso.

¿El reproductor flash está haciendo algo así como Java y reserva espacio de pila y no lo libera hasta que se cierra la aplicación?

Bueno, sí y no, como se podría haber leído en innumerables entradas del blog de la GC en AVM2 es optimista y trabajará es poseer de manera misteriosa. Así que funciona un poco como Java e intenta reservar espacio en montón, sin embargo, si lo dejas lo suficiente y comienzas a hacer otras operaciones que consumen memoria significativa, liberará ese espacio anterior. Puedes ver esto usando el generador de perfiles durante la noche con algunas pruebas ejecutándose en la parte superior de tu aplicación.

7

lo tanto, si me carga decir 20MB de MySQL, en el Administrador de tareas de la memoria RAM para la aplicación sube en alrededor de 25 MB. Luego, cuando cierro la conexión y trato de eliminar el ByteArray, la RAM nunca se libera. Sin embargo, si uso System.totalMemory, flash player muestra que la memoria se está liberando, lo que no es el caso.

El reproductor está "liberando" la memoria. Si minimiza la ventana y la restaura, debería ver que la memoria está ahora mucho más cerca de lo que muestra System.totalMemory.

Puede que también le interese utilizar las herramientas de creación de perfiles de FlexBuilder que pueden mostrarle si realmente tiene fugas de memoria.

Cuestiones relacionadas