Pregunta

¿Cómo descargo con fuerza un ByteArray desde la memoria usando 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;
}

No hay solución correcta

Otros consejos

No creo que tengas nada de qué preocuparte.Si System.totalMemory baja, puedes relajarte.Es muy posible que sea el sistema operativo el que no recupere la memoria recién liberada (anticipándose a la próxima vez que Flash Player solicite más memoria).

Intente hacer algo más que consuma 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 tengo entendido, la gestión de la memoria en los sistemas operativos modernos no es intuitiva desde la perspectiva de observar las cantidades asignadas a cada proceso, o incluso la cantidad total asignada.

Cuando uso mi Mac durante 5 minutos, se usa el 95% de mis 3 GB de RAM y así permanecerá, nunca bajará.Así es como el sistema operativo maneja la memoria.

Siempre que no sea necesario en ningún 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).

(No estoy seguro de esto, pero...)

AS3 utiliza una recolección de basura no determinista.Lo que significa que la memoria sin referencia se liberará cuando el tiempo de ejecución lo desee (normalmente no a menos que haya 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 de recolección de basura (como C# y Java también).

Suponiendo que no haya otras referencias al recuerdo señalado por byteArray o los elementos dentro de la propia matriz, la memoria se liberará en algún momento después de salir del alcance donde byteArray está declarado.

Puedes forzar una recolección de basura, aunque en realidad no deberías hacerlo.Si lo haces, hazlo sólo para probar...si lo hace en producción, perjudicará el rendimiento mucho más que lo ayudará.

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

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

Puede leer más aquí.

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 que es posible que el recolector de basura no se ejecute cuando usted lo desee.

Por esohttp://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();
}

Creo que has respondido tu propia pregunta...

System.totalMemory le proporciona la cantidad total de memoria que se está "utilizando", no asignada.Es cierto que es posible que su aplicación solo esté usando 20 MB, pero tiene 5 MB que están libres para futuras asignaciones.

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

Desafortunadamente, cuando se trata de gestión de memoria en Flash/script de acción no hay mucho que puedas 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 gestión de la memoria)

La siguiente es una solución alternativa, en lugar de crear un ByteArray variable prueba 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 le asignó.

Entonces, si cargo, digamos, 20 MB desde 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 la memoria se está liberando, lo cual no es el caso.

¿El reproductor flash está haciendo algo como Java y reserva espacio en el montón y no lo libera hasta que se cierra la aplicación?

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

Entonces, si cargo, digamos, 20 MB desde 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 la memoria se está liberando, 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 interesarle utilizar las herramientas de creación de perfiles de FlexBuilder, que pueden mostrarle si realmente tiene pérdidas de memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top