Skip to main content
Inspiring
March 30, 2014
Answered

How can I free up memory?

  • March 30, 2014
  • 1 reply
  • 3217 views

I tried set `NULL`, but I can not free memory.

How to free memory after `FileReference.addEventListener(Event.COMPLETE, ...)`?

See my code:

main.as

    package {

        import com.mainpackage.LoaderTestCase;

   

        import flash.net.FileReferenceList;

        import flash.net.FileReference;

        import flash.net.FileFilter;

        import flash.events.MouseEvent;

        import flash.events.Event;

        import flash.display.MovieClip;

   

        public class main extends MovieClip {

            private var listFiles:Array;

            private var allTypes:Array;

            private var fileRef:FileReferenceList;

   

            public function main()

            {

                listFiles    = [];

                allTypes    = [];

                fileRef        = new FileReferenceList();

                fileRef.addEventListener(Event.SELECT, SELECT);

   

                fileRef.browse(allTypes);

            }

   

            private function SELECT(e:Event):void

            {

                var list:Array = fileRef.fileList;

                var file:FileReference;

       

                for each (file in list) {

                    insert(file);

                }

            }

   

            private function insert(file:FileReference):void

            {

                var fire:LoaderTestCase = new LoaderTestCase(file);

                fire.destroy(function():void{

                    fire = null;

                });

            }

        }

    }

LoaderTestCase.as

    package com.mainpackage

    {

        import flash.net.FileReference;

        import flash.events.Event;

        import flash.display.Loader;

   

        public class LoaderTestCase

        {

            private var file:FileReference;

            private var loader:Loader;

            private var callback:Function;

   

            public function LoaderTestCase(e:FileReference)

            {

                file = e;

                trace("OPEN: " + file.name);

                file.addEventListener(Event.COMPLETE, loadFile);

                file.load();

                e = null;

            }

   

            public function loadFile(e:Event):void

            {

                file.removeEventListener(Event.COMPLETE, loadFile);

   

                trace("LOAD: " + file.name);

   

                file    = null;

                e        = null;

                callback();

            }

   

            public function destroy(a:Function):void

            {

                callback = a;

            }

        }

    }

This topic has been closed for replies.
Correct answer Guilherme BrContainer

Have you tried running this in the Flash Builder profiler to see who is loitering?


Amy I reached my goal, see results:

  1.     Firefox/Safari (Flash plugin version 12.0.0.77): Initiate with 9Mb, goes up 135Mb and ends with 17Mb.
  2.     Google Chrome (PepperFlash version 12.0.0.70): Initiate with 12Mb, goes up 132Mb and ends with 17Mb.
  3.     Flash Player (Adobe CS5/Release/FlashPlayer.exe version 10 - 12 without run CS5): Initiate with 6Mb, goes up 185Mb and ends with 185Mb.

I realized something, with FileReferenceList.fileList if I so did FileReferenceList.fileList[5] = null; (when the "sixth file" is not being used more) Flash memory immediately frees this specific FileReference.

Worked on all desktop / Plugins / PepperFlash.

package {
     import flash.net.FileReferenceList;
     import flash.net.FileReference;
     import flash.net.FileFilter;
     import flash.events.MouseEvent;
     import flash.events.Event;
     import flash.display.Sprite;
     import flash.display.Loader;
     import flash.display.Bitmap;
     import flash.display.BitmapData;
     import      flash.geom.Matrix;

     public class Main extends Sprite
     {
          private var listFiles:Array;
          private var allTypes:Array;
          private var fileRef:FileReferenceList;
          private var tmpFile:FileReference;
          private var i:uint=0;
          private var j:uint=0;
          private var timer:uint;
          private var imageTypes:FileFilter;
          private var enable:Boolean;
          private var imageLoader:Loader;

          public function Main()
          {
               imageTypes      = new FileFilter(
                    "Images (*.JPG;*.JPEG;*.JPE;)", "*.jpg; *.jpeg; *.jpe;"
               );
               listFiles     = [];
               allTypes     = [imageTypes];

               eventBrowse(true);
          }

          private function eventBrowse(a:Boolean):void
          {
               enable = a;
               if(a===true) {
                    stage.addEventListener(MouseEvent.CLICK, browse);

                    fileRef = new FileReferenceList();
                    fileRef.addEventListener(Event.SELECT, select);
               } else {
                    fileRef.removeEventListener(Event.SELECT, select);
                    fileRef = null;

                    stage.removeEventListener(MouseEvent.CLICK, browse);
               }
          }

          private function browse(e:MouseEvent):void
          {
               if(enable===true) {
                    fileRef.browse(allTypes);
               }
          }

          private function select(e:Event):void
          {
               listFiles = fileRef.fileList;

               eventBrowse(false);

               i=0;
               j=listFiles.length;

               if(j>0) {
                    loadNextFile();
               }
          }

          private function loadNextFile():void
          {
               if(!(i<j)) {
                    listFiles = null;
                    trace("Free memory???");
                    trace("--------------");
                    trace("listFiles:"+     listFiles);
                    trace("allTypes:" + allTypes);
                    trace("fileRef:" + fileRef);
                    trace("tmpFile:" + tmpFile);
                    trace("i:" + i);
                    trace("j:" + j);
                    trace("timer:" + timer);
                    trace("--------------");
                    eventBrowse(true);
                    return;
               }

               tmpFile = listFiles;
               trace("Initiate load:" + tmpFile.name);
               tmpFile.addEventListener(Event.COMPLETE, loadedFile);
               tmpFile.load();
          }

          private function loadedFile(f:Event):void
          {
               trace(listFiles);
               trace("Finished load:" + tmpFile.name);
               tmpFile.removeEventListener(Event.COMPLETE, loadedFile);

               tmpFile = null;
               listFiles = null;
     
               i++;
               loadNextFile();
          }
     }
}

1 reply

kglad
Community Expert
Community Expert
March 30, 2014

what memory are you trying to clear?

what are you doing to test that memory?

and read about actionscript 'garbage collection' to understand how system memory is cleared if that's what you're trying to clear, http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

Inspiring
March 30, 2014

Hi @kglad I setting NULL in all variables, but nothing works. See how the memory is, after selecting many images with FileReference (and even by setting NULL does not  free the memory):

How can I free up the memory?

kglad
Community Expert
Community Expert
March 30, 2014

read the gc article to understand that setting something to null, at most, readies an object for gc.  it's not removed until sometime afterward, if necessary (as decided by the flash player).

though with air apps and while testing, you can use System.gc() to force gc'g.