Pregunta

Tengo una bastante grande Flex & Papervision3D aplicación que crea y destruye continuamente objetos.También carga y descarga SWF archivos de recursos también.Mientras se ejecuta el archivo SWF lentamente consume memoria hasta alrededor de 2GB cuando grazna el jugador.Obviamente estoy bastante seguro de que me deje ir de referencia a los casos ya no quiero con la expectativa de la GC va a hacer su trabajo.Pero tengo una diablos de un tiempo de averiguar dónde está el problema.

He intentado usar el analizador y sus opciones para la captura de instantáneas de la memoria, etc - pero mi problema sigue siendo evasivo.Creo que hay problemas con reproductor de depuración de Flash también?Pero me da ninguna alegría el uso de la versión cualquiera.

¿Cómo usted va sobre el rastreo de pérdida de memoria problemas de uso de FLEX/AS3 ?¿Cuáles son algunas estrategias, trucos o herramientas que se han utilizado para localizar el consumo de

¿Fue útil?

Solución

Me tropecé con algo que explica cómo utilizar Flex Analizador en Flex Builder y fue una GRAN ayuda para mí en la depuración de las fugas de memoria.Definitivamente, me gustaría sugerir tratando de salir.Es muy fácil de usar.Algunas cosas que he encontrado en la generación de perfiles de mis aplicaciones:

Evite el uso de colecciones (al menos las GRANDES colecciones) como las propiedades de los Objetos de Valor.Había varios tipos de Valor de las Clases de Objetos en mi Cairngorm de la aplicación, y cada uno tenía un "niños" de la propiedad, que era un ArrayCollection, y fue utilizada para el filtrado.Cuando perfiles, he encontrado que estos fueron uno de mis más grandes de la memoria de comer, así que he cambiado mi aplicación para que en lugar de almacenar el "parentId" como un int y el uso de esta para el filtrado.La memoria utilizada fue reducir drásticamente.Algo como esto:

Vieja manera:

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 sugiero la eliminación de los detectores de eventos cuando ya no son necesarios.

Otros consejos

Por lo general poner en práctica un método de limpieza en todas las clases que hacer (ya que como no tiene destructores). El principal problema que he notado con la GC es con detectores de eventos. Adicional a lo dirkgently dicho, también tratar de evitar funciones de detector anónimos (como no se puede eliminar de forma explícita). Aquí hay algunos enlaces que pueden ser de utilidad:

debido a problemas como éste que he desarrollado una biblioteca de código abierto que ayuda a supervisar todos los eventos de su ejecución en un momento dado. es realmente fácil de implementar y proyectos que he re-factor en 10-15 minutos convertirlos a utilizar el EventController he desarrollado.

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

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

el resto es lo mismo lo que haría es registrar el evento y que sea una locura fácil de ver todos sus eventos en cualquier punto que desee mediante el EC.log ();

todos los detalles y la documentación están en mi sitio me encantaría saber si esto le ayuda y si empezar a trabajar con él. Si tiene algún comentario bueno o malo no dude en publicarlo y me gustaría ver en ella!

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

Si su pérdida de memoria crece exponencialmente, probablemente significa GC está fallando para hacer su trabajo. Echar un vistazo a su código y ver donde se puede disminuir el recuento de referencia de tus objetos (estableciendo su valor a null). Hacer evento manipuladores débil. Y re-perfil.

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