2009-03-20 13 views
6

Tengo una Flex bastante grande & Aplicación Papervision3D que crea y destruye objetos continuamente. También carga y descarga archivos de recursos SWF. Mientras se ejecuta, el archivo SWF consume lentamente memoria hasta aproximadamente 2 GB cuando croa el reproductor. Obviamente, estoy bastante seguro de que dejo de referencia las instancias que ya no quiero con la expectativa de que el GC hará su trabajo. Pero me está costando imaginar dónde está el problema.Depuración de fugas de memoria FLEX/AS3

He intentado utilizar el generador de perfiles y sus opciones para capturar instantáneas de memoria, etc., pero mi problema sigue siendo evasivo. Creo que hay problemas conocidos con el uso de depuración de Flash Player también? Pero tampoco me agrada usar la versión de lanzamiento.

¿Cómo hacer un seguimiento de los problemas de pérdida de memoria con FLEX/AS3? Cuáles son algunas estrategias, trucos o herramientas que ha utilizado para localizar el consumo

Respuesta

3

me encontré con algo que explica cómo utilizar Flex Profiler en Flex Builder y fue una enorme ayuda para mí en la depuración pérdidas de memoria. Definitivamente, sugeriría probarlo. Es muy fácil de usar. Algunas cosas que encontré al crear un perfil de mis aplicaciones:

Evite el uso de colecciones (al menos colecciones GRANDES) como propiedades de objetos de valor. Tenía varios tipos de Value Object Classes en mi aplicación Cairngorm, y cada uno tenía una propiedad "children" que era ArrayCollection, y se utilizaba para filtrar. Al crear perfiles, descubrí que estos eran uno de mis mayores consumidores de memoria, así que cambié mi aplicación para almacenar el "parentId" como un int y usar esto para filtrar. La memoria utilizada fue cortada drásticamente. Algo como esto:

manera antigua:

public class Owner1 
{ 
    public var id:int; 
    public var label:String; 
    public var children:ArrayCollection; // Stores any number of Owner2 Objects 
} 

public class Owner2 
{ 
    public var id:int; 
    public var label:String; 
    public var children:ArrayCollection; // Stores any number of Owner3 Objects 
} 

public class Owner3 
{ 
    public var id:int; 
    public var label:String; 
} 

nueva forma:

public class Owner1 
{ 
    public var id:int; 
    public var label:String; 
} 

public class Owner2 
{ 
    public var id:int; 
    public var label:String; 
    public var parentId:int; // Refers to id of Owner1 Object 
} 

public class Owner3 
{ 
    public var id:int; 
    public var label:String; 
    public var parentId:int; // Refers to id of Owner2 Object 
} 

También quisiera sugerir la eliminación de los detectores de eventos cuando ya no son necesarios.

2

Si la pérdida de memoria aumenta exponencialmente, probablemente signifique que GC no está haciendo su trabajo. Eche un vistazo a su código y vea donde pueda disminuir los recuentos de referencia de sus objetos (estableciéndolos en null). Haga que los controladores de eventos sean débiles. Y volver a perfilar

4

Normalmente implemento un método de limpieza en cada clase que hago (ya que AS no tiene destructores). El principal problema que he notado con el GC es con los oyentes del evento. Adicional a lo dicho dirkgently, también intente evitar las funciones de escucha anónimas (ya que no puede eliminarlas explícitamente). Aquí hay algunos enlaces que pueden ser de utilidad:

+0

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/arguments.html#callee – Jotham

3

debido a problemas como este He desarrollado una biblioteca de código abierto que ayuda a controlar todos los eventos que se ejecutan en un momento dado. es realmente fácil de implementar y he rediseñado proyectos en 10 a 15 minutos, convirtiéndolos para usar el EventController que he desarrollado.

básicamente para su escenario me gustaría ejecutar a través de todos los eventos y reemplazarlos de: obj.addEventListener (...);

a: EC.add (obj, ...);

el resto es lo mismo que lo que haría es registrar el evento y hacer que sea increíblemente fácil ver todos sus eventos en cualquier punto que desee utilizando el EC.log();

todos los detalles y documentación están en mi sitio Me gustaría saber si esto lo ayuda y si comienza a trabajar con él. ¡Si tiene algún comentario bueno o malo, no dude en publicarlo y lo investigaré!

el sitio es: http://fla.as/ec/