arrays actionscript-3 flex apache-flex

arrays - Descarga de un ByteArray con Actionscript 3



actionscript-3 flex (8)

¿Cómo descargo a la fuerza un ByteArray de la memoria con ActionScript 3?

He probado lo siguiente:

// First non-working solution byteArray.length = 0; byteArray = new ByteArray(); // Second non-working solution for ( var i:int=0; i < byteArray.length; i++ ) { byteArray[i] = null; }


Entonces, si cargo 20 MB de MySQL, en el Administrador de tareas, la RAM para la aplicación aumenta aproximadamente 25 MB. Luego, cuando cierro la conexión e intento deshacerme del ByteArray, la RAM nunca se libera. Sin embargo, si uso System.totalMemory, Flash Player muestra que se está liberando la memoria, lo cual no es el caso.

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

También podría estar interesado en usar las herramientas de creación de perfiles de FlexBuilder que pueden mostrarle si realmente tiene pérdidas de memoria.


Entonces, si cargo 20 MB de MySQL, en el Administrador de tareas, la RAM para la aplicación aumenta aproximadamente 25 MB. Luego, cuando cierro la conexión e intento deshacerme del ByteArray, la RAM nunca se libera. Sin embargo, si uso System.totalMemory, Flash Player muestra que se está liberando la memoria, lo cual no es el caso.

¿El reproductor flash está haciendo algo como Java y está reservando espacio de almacenamiento dinámico y no lo está liberando hasta que se cierra la aplicación?

Bueno, sí y no, como puede haber leído en innumerables publicaciones de blog, el GC en AVM2 es optimista y funcionará de manera misteriosa. Por lo tanto, funciona un poco como Java e intenta reservar espacio de almacenamiento dinámico, sin embargo, si lo deja el tiempo suficiente y comienza a realizar otras operaciones que consumen una cantidad considerable de memoria, liberará ese espacio anterior. Puede ver esto usando el generador de perfiles durante la noche con algunas pruebas ejecutándose en la parte superior de su aplicación.


(No soy positivo sobre esto, pero ...)

AS3 utiliza una recolección de basura no determinista. Lo que significa que la memoria no referenciada se liberará cada vez que el tiempo de ejecución lo desee (por lo general, a menos que haya una razón para ejecutar, ya que es una operación costosa de ejecutar). Este es el mismo enfoque utilizado por la mayoría de los lenguajes recolectados de basura modernos (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 que salga del ámbito donde se declara byteArray .

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

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

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

Puedes leer más aquí .


Creo que has respondido tu propia pregunta ...

System.totalMemory le brinda la cantidad total de memoria que se está "utilizando", no asignada. Es exacto que su aplicación solo esté usando 20 MB, pero tiene 5 MB que son gratuitos para futuras asignaciones.

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


Desafortunadamente, cuando se trata de gestión de memoria en Flash / actionscript, no hay mucho que puedas hacer. ActionScript fue diseñado para ser fácil de usar (por lo que no querían que las personas se preocuparan por la administración de la memoria)

La siguiente es una solución alternativa, 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;

Donde byteArray es una propiedad dinámica de byteObject , puede liberar la memoria que se le asignó.


Mira 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 tengo es eso, porque el recolector de basura podría no ejecutarse cuando lo desee.

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(); }


No creo que tengas nada de qué preocuparte. Si System.totalMemory se cae, puede relajarse. Es muy posible que sea el sistema operativo el que no recupere la memoria recién liberada (en previsión de la próxima vez que Flash Player solicitará 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.

Según he entendido, la administración de memoria en los sistemas operativos modernos no es intuitiva desde la perspectiva de mirar las cantidades asignadas a cada proceso, o incluso la cantidad total asignada.

Cuando utilizo mi Mac durante 5 minutos, se utiliza el 95% de mi RAM de 3 GB, y se mantendrá así, nunca se cae. Esa es la forma en que el sistema operativo maneja la memoria.

Mientras no sea necesario en otro lugar, incluso los procesos que se han cerrado todavía tienen memoria asignada (esto puede hacer que se inicien más rápido la próxima vez, por ejemplo).