Comunidad de diseño web y desarrollo en internet

Clase para manejar el Garbage Collector de Flash Player

Como todos sabrán el Flash Player, si no lo controlamos de cerca, es un verdadero pozo sin fondo que se come la memoria de la máquina y hace que la experiencia de usuario en un sistema web (Flex/Flash) o en un sitio con alto contenido gráfico/video/3D sea un suplicio y terminemos optando por salir de la web o en el peor de los casos reiniciando el browser.

Aca les dejo una clase que maneja el Garbage Collector (GC) del Flash player. Esta clase provee diferentes métodos, veamos:

Eliminar loaders con unloadAndStop si se puede y ejecutando el GC si se lo indica

Código :

 loader = new Loader();
.
.
Cleanner.unload(loader, true);


Ejecución del GC

Código :

Cleanner.gc();


Ejecución automática del GC (si supera x cantidad de memoria usada) cada x cantidad de segundos (permite configuraciones varias)

Código :

Cleanner.startGCController()


Esta clase ejecuta el codigo correspondiente dependiendo del FP que se tenga.

Por otro lado esta clase solo intenta mejorar la liberación de memoria para elementos cargados dinámicamente y la ejecución automática del GC, con herramientas que nos provee AS3.0. Otros problemas de sobrecarga de memoria corresponden a un control propio del programador, tales como:

1. No tener referencias cruzadas
2. Eliminar todas las refencias, listeners, sonidos, videos, eventos, efectos, etc de los elementos q se van a elimiar
3. Usar referencias débiles
4. Hacer un buen testing de performance.

Tal vez esto sea bueno para combinarlo con un visor del framerate, ya que a veces suele ir de la mano la caida del framerate con el gran uso de memoria..

Igualmente a esta clase aun le faltan un par de cositas, pero se puede utilizar tranquilamente...

Bueno, aca les dejo la clase

Código :

/**
 * 
 * Copyright (c) 2008 Andrés Lozada Mosto, All Rights Reserved.
 * 
 * Contact alfathenus@gmail.com
 * See www.3wstudio.com.ar
 *  
 * Permission is hereby granted, free of charge, to any person obtaining a copy of 
 * this software and associated documentation files (the "Software"), to deal in 
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all 
 * copies or substantial portions of the Software.
 * 
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE. 
 * 
 */
package com.kcc.tempos.utils.loaders
{
   import flash.display.Loader;
   import flash.errors.IllegalOperationError;
   import flash.net.LocalConnection;
   import flash.system.System;
   import flash.utils.clearInterval;
   import flash.utils.setInterval;
   
   /**
    * 
    * Provide an API to manage dynamic memory of Flash Player.
    * 
    * <p>The <code>Cleaner</code> class contains the following static variables and functions </p> 
    * <pre>
    *    <b>Variables</b>
    *    static public var warningMemory:int;
    *    static public var abortMemory:int;
    *    static public var funcCrash:Function;
    *    static public var timeToCheckMemory:int;
    *    <b>Functions</b>
    *    static public function unload(loader:Loader, gc:Boolean = false):void;
    *    static function gc():void;
    *    static public function startGCController():void;
    *    static public function endGCController():void;
    * </pre>
    * 
    * 
    * @playerversion Flash 9
    * @langversion 3.0
    * 
    * 
    * Sites to help me:
    * (1) http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/
    * (2) http://gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html
    * 
    * Next steps
    * # Test perfom
    * # Full functionaly testing over diferents situations and environments
    * # Add Air total Support
    * # English documentation
    * 
    */
   
   public class Cleanner
   {
      //-----------------------
      // Variables
      //-----------------------
      /**
       * Memoria para ejecutarse el GC
       */
      static public var warningMemory:int = 1000*1000*500;
      /**
       * Memoria para el crash
       */
      static public var abortMemory:int = 1000*1000*625;
      /**
       * Funcion q se ejecuta al hacer crashh (sin memoria)
       */
      static public var funcCrash:Function;
      /**
       * Cada cuanto tiempo se verifica el uso de la memoria 
       * cuando se esta haciendo el trakeo
       */
      static public var timeToCheckMemory:int = 10000;
      static private var id:int; 
      //-----------------------
      // Constructor
      //-----------------------
      public function Cleanner()
      {
         throw new IllegalOperationError("ClearLoaders is static. It don't create intances"); 
      }
      
      //-----------------------
      // Public Methods
      //-----------------------
      /**
       * 
       * Elimino algo que haya cargado por Loader.
       * No siempre combiene pasar el GC luego de 
       * eliminar un modulo o swf cargado porque caería
       * la eficiencia general de la aplicación.
       * 
       * @param loader       Referencia a un Loader
       * @param gc         Indica si al descargar debe correrse el Garbage Collector
       * 
       */
      static public function unload(loader:Loader, gc:Boolean = false):void
      {
         try
         { // para FP 10 o superior
            loader.unloadAndStop()
         }
         catch (e:Error)
         {
            loader.unload();
         }
         
         if ( gc )
            Cleanner.gc();
      }
      
      /**
       * 
       * Ejecuto el Garbage Collector del Flash Player
       * para que libere la memoria
       * 
       */
      static public function gc():void
      {
         try
         { // para FP10 o superior
            System.gc();
         }
         catch
         {
            try { // versiones anteriores
               new LocalConnection().connect('foo');
               new LocalConnection().connect('foo');
            } 
            catch (e:*) 
            {
            }
         }
      }
      
      /**
       * 
       * Trackea el uso de la memoria y la va liberando
       * de forma automatica
       * 
       */
      static public function startGCController():void
      {
         if (Cleanner.id == null || Cleanner.id == undefined)
         {
            Cleanner.checkMemoryUsage();
            Cleanner.id = setInterval(checkMemoryUsage, Cleanner.timeToCheckMemory);
         }
      }
      
      /**
       * 
       * Termino el trackeo de la memoria
       * 
       */
      static public function endGCController():void
      {
         clearInterval(Cleanner.id);
         Cleanner.id = undefined;
      }
      
      //-----------------------
      // Private Methods
      //-----------------------
      static private function checkMemoryUsage() {
         if (System.totalMemory > Cleanner.warningMemory) {
            Cleanner.gc();
          } else if (System.totalMemory > Cleanner.abortMemory) {
            //crashhhhh 
            if ( Cleanner.funcCrash != null )
               Cleanner.funcCrash();
          }
      }
   }
}


Bueno, espero q les sirva y les sea de utilidad.... y ojalá entre todos la podamos ir mejorando y agregandole funcionalidades interesantes.

Saludos!!

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate