¿Cómo descargar un bytearray usando ActionScript 3? -- arrays campo con actionscript-3 campo con apache-flex camp Relacionados El problema

How to unload a ByteArray using Actionscript 3?


93
vote

problema

Español

¿Cómo descargo en la fuerza un ByteArray de la memoria usando ActionScript 3?

He intentado lo siguiente:

  AF_INET0  
Original en ingles

How do I forcefully unload a ByteArray from memory using ActionScript 3?

I have tried the following:

// 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; } 
</div
        

Lista de respuestas

35
 
vote

No creo que tenga nada de qué preocuparse. Si System.totalMemory baja, puedes relajarte. Puede muy bien ser el sistema operativo que no reclame la memoria recién liberada (en anticipación de la próxima vez que Flash Player solicite más memoria).

Trate de hacer algo más que sea muy de memoria y estoy seguro de que notará que la memoria asignada a Flash Player disminuirá y se utilizará para el otro proceso.

Como lo he entendido, la gestión de la memoria en los OS modernos no es intuitiva desde la perspectiva de observar las cantidades asignadas a cada proceso, o incluso la cantidad total asignada.

Cuando he usado mi MAC durante 5 minutos, se usa el 95% de mi RAM de 3 GB, y se mantendrá así, nunca se apaga. Así es como el sistema operativo maneja la memoria.

Mientras no sean necesarios en otros lugares, incluso los procesos que han abandonado aún tienen la memoria asignada (esto puede hacer que se lanzaran más rápido la próxima vez, por ejemplo).

 

I don't think you have anything to worry about. If System.totalMemory goes down you can relax. It may very well be the OS that doesn't reclaim the newly freed memory (in anticipation of the next time Flash Player will ask for more memory).

Try doing something else that is very memory intensive and I'm sure that you'll notice that the memory allocated to Flash Player will decrease and be used for the other process instead.

As I've understood it, memory management in modern OS's isn't intuitive from the perspective of looking at the amounts allocated to each process, or even the total amount allocated.

When I've used my Mac for 5 minutes 95% of my 3 GB RAM is used, and it will stay that way, it never goes down. That's just the way the OS handles memory.

As long as it's not needed elsewhere even processes that have quit still have memory assigned to them (this can make them launch quicker the next time, for example).

</div
 
 
25
 
vote

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

AS3 utiliza una recolección de basura no determinista, lo que significa que la memoria deserreenciada se liberará cada vez que se siente que el tiempo de ejecución se sienta así (normalmente no, a menos que haya una razón para ejecutarse, ya que es una operación costosa para ejecutar). Este es el mismo enfoque utilizado por la mayoría de los idiomas de recolección de basura modernos (como C # y Java también).

Suponiendo que no haya 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 alcance donde byteArray < / Código> se declara.

Puedes forzar una recolección de basura, aunque realmente no deberías. Si lo haces, hazlo solo para las pruebas. Si lo haces en producción, lastimarás 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í .

 

(I'm not positive about this, but...)

AS3 uses a non-deterministic garbage collection which means that dereferenced memory will be freed up whenever the runtime feels like it (typically not unless there's a reason to run, since it's an expensive operation to execute). This is the same approach used by most modern garbage collecting languages (like C# and Java as well).

Assuming there are no other references to the memory pointed to by byteArray or the items within the array itself, the memory will be freed at some point after you exit the scope where byteArray is declared.

You can force a garbage collection, though you really shouldn't. If you do, do it only for testing. If you do it in production, you'll hurt performance much more than help it.

To force a GC, try (yes, twice):

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

You can read more here.

</div
 
 
20
 
vote

Echa un vistazo a este artículo

http://www.gskinner.com/blog/archives/ 2006/06 / AS3_RESOURCE_MA.HTML

Programador de ActionScript IANA, sin embargo, la sensación que recibe es que, debido a que el recolector de basura no puede funcionar cuando lo desee.

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

Entonces, recomendaría probar su código de recolecció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(); }   
 

Have a look at this article

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

IANA actionscript programmer, however the feeling I'm getting is that, because the garbage collector might not run when you want it to.

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

So I'd recommend trying out their collection code and see if it helps

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(); } 
</div
 
 
16
 
vote

Lamentablemente cuando se trata de la administración de la 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ía que las personas tengan que preocuparse por la gestión de la memoria)

La siguiente es una solución, en lugar de crear una variable byteArray4 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 asignó para ello.

 

Unfortunately when it comes to memory management in Flash/actionscript there isn't a whole lot you can do. ActionScript was designed to be easy to use (so they didn't want people to have to worry about memory management)

The following is a workaround, instead of creating a ByteArray variable try this.

var byteObject:Object = new Object();  byteObject.byteArray = new ByteArray();  ...  //Then when you are finished delete the variable from byteObject delete byteObject.byteArray; 

Where byteArray is a dynamic property of byteObject, you can free the memory that was allocated for it.

</div
 
 
16
 
vote

Creo que has respondido tu propia pregunta.

System.totalMemory le brinda la cantidad total de memoria "utilizada", no asignada. Es preciso que su aplicación solo pueda usar 20 MB, pero tiene 5 MB que es gratuita para futuras asignaciones.

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

 

I believe you have answered your own question.

System.totalMemory gives you the total amount of memory being "used", not allocated. It is accurate that your application may only be using 20 MB, but it has 5 MB that is free for future allocations.

I'm not sure whether the Adobe docs would shed light on the way that it manages memory.

</div
 
 
11
 
vote

Por lo tanto, si lo carga, diga 20 MB de MySQL, en el administrador de tareas, la RAM para que la aplicación aumenta aproximadamente 25 MB. Luego, cuando cierro la conexión y trato de disponer el ByteArray, la RAM nunca se libera. Sin embargo, si uso System.TotMemory, Flash Player muestra que se está lanzando la memoria, que no es el caso.

¿Está el jugador flash que hace algo como Java y reservando el espacio en el montón y no la liberación hasta que la aplicación se deja?

Bueno, sí y no, como podría haber leído de innumerables publicaciones de blogs que el GC en AVM2 es optimista y funcionará sus propias formas misteriosas. Así que funciona un poco como Java y trata de reservar espacio en el montón. Sin embargo, si lo dejaste lo suficiente y comenzar a hacer otras operaciones que consumen alguna memoria significativa, liberará ese espacio anterior. Puede ver esto utilizando el perfilador durante la noche con algunas pruebas que se ejecutan en la parte superior de su aplicación.

 

So, if I load say 20MB from MySQL, in the Task Manager the RAM for the application goes up by about 25MB. Then when I close the connection and try to dispose the ByteArray, the RAM never frees up. However, if I use System.totalMemory, flash player shows that the memory is being released, which is not the case.

Is the flash player doing something like Java and reserving heap space and not releasing it until the app quits?

Well yes and no, as you might have read from countless blog posts that the GC in AVM2 is optimistic and will work its own mysterious ways. So it does work a bit like Java and tries to reserve heap space. However if you let it long enough and start doing other operations that are consuming some significant memory, it will free that previous space. You can see this using the profiler overnight with some tests running on top of your app.

</div
 
 
10
 
vote

Por lo tanto, si lo carga, diga 20 MB de MySQL, en el administrador de tareas, la RAM para que la aplicación aumenta aproximadamente 25 MB. Luego, cuando cierro la conexión y trato de disponer el ByteArray, la RAM nunca se libera. Sin embargo, si uso System.TotMemory, Flash Player muestra que se está lanzando la memoria, que no es el caso.

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

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

 

So, if I load say 20MB from MySQL, in the Task Manager the RAM for the application goes up by about 25MB. Then when I close the connection and try to dispose the ByteArray, the RAM never frees up. However, if I use System.totalMemory, flash player shows that the memory is being released, which is not the case.

The player is "releasing" the memory. If you minimize the window and restore it you should see that the memeory is now much closer to what System.totalMemory shows.

You might also be interested in using FlexBuilder's profiling tools which can show you if you really have memory leaks.

</div
 
 
8
 
vote

Usa estos recursos:

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe -7FFF7.HTML

y este

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe -7FFF7.HTML

 

Use these resources:

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html

and this

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html

</div
 
 

Relacionados problema

93  ¿Cómo descargar un bytearray usando ActionScript 3?  ( How to unload a bytearray using actionscript 3 ) 
¿Cómo descargo en la fuerza un ByteArray de la memoria usando ActionScript 3? He intentado lo siguiente: AF_INET0 ...

0  Flex - ¿Cómo funciona nativeApplication.icon?  ( Flex how does nativeapplication icon work ) 
NativeApplication.nativeApplication.icon.bitmaps = bitmapData(); Estoy tratando de editar los mapas de bits para el icono de la bandeja del sistema, pero...

20  Obtenga el usuario de OS registrado actualmente en Adobe Air  ( Get the current logged in os user in adobe air ) 
Necesito el nombre del usuario que ha iniciado sesión actual en mi aplicación Air / Flex . La aplicación solo se implementará en las máquinas de Windows. Cre...

1  ¿Cómo guardo un formulario a la base de datos sin conocer el tipo de campo o su ID en Flex y ColdFusion?  ( How do i save a form to the database without knowing the field type or its id in ) 
Estoy trabajando en una función para generar un formulario en tiempo de ejecución en Flex en función de una llamada al DB. La llamada a la DB devuelve los tip...

2  ¿Hay algún buen programa para ActionScript / Flex que cuenten líneas de código, número de funciones, archivos, paquetes, etc  ( Are there any good programs for actionscript flex thatll count lines of code n ) 
Doug McCune había creado algo que era exactamente lo que necesitaba ( http://dougmccune.com/blog/2007/05/10/analyze-your-actionscript-code-with-this-apollo-ap...

0  Google Maps API Flex: manejar las dos clics dobles e individuales?  ( Google maps flex api handle both double and single clicks ) 
¿Cómo se le dice a un solo clic de ratón desde un doble clic? mi única clic oyente parece estar atrapando a todos los dobles clics, así: tz localizador ...

2  Problemas con los eventos itemrollover y itemRollout en el componente de la lista  ( Problems with itemrollover and itemrollout events on list component ) 
He establecido el itemRollOver y itemRollOut Event Los oyentes en un componente de lista, pero cada vez que enroleo el mouse sobre un elemento de la lista...

0  Problemas de clonación de un bytearray extendido  ( Trouble cloning an extended bytearray ) 
He extendido la clase BYTEARRARY, como esta: [RemoteClass(alias="MyByteArray")] public class MyByteArray extends ByteArray {} y se clonó una instancia ...

19  ¿Cómo puedo probar las aplicaciones flexibles de la unidad dentro del IDE o un script de compilación?  ( How can i unit test flex applications from within the ide or a build script ) 
Actualmente estoy trabajando en una aplicación con un frontend escrito en Adobe Flex 3. Soy consciente de FlexUnit Pero lo que realmente me gustaría es un c...

50  Sqlstatement.execute () - consultas múltiples en una declaración  ( Sqlstatement execute multiple queries in one statement ) 
He escrito un script de generación de bases de datos en sql y quiero ejecutarlo en mi < un href = "http://en.wikipedia.org/wiki/adobe_integrated_runtime" re...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos