Search code examples
apache-flexactionscript-3debuggingmemory-leakspapervision3d

Debugging FLEX/AS3 memory leaks


I have a pretty big Flex & Papervision3D application that creates and destroys objects continually. It also loads and unloads SWF resource files too. While it's running the SWF slowly consumes memory til about 2GB when it croaks the player. Obviously I am pretty sure I let go of reference to instances I no longer want with expectation the GC will do its job. But I am having a heck of a time figuring out where the problem lies.

I've tried using the profiler and its options for capturing memory snapshots, etc - but my problem remains evasive. I think there are known problems using debug Flash player also? But I get no joy using the release version either.

How do you go about tracking down memory leak problems using FLEX/AS3 ? What are some strategies, tricks, or tools you have used to locate consumption


Solution

  • I stumbled across something explaining how to use Flex Profiler in Flex Builder and it was a HUGE help to me in debugging memory leaks. I would definitely suggest trying it out. It's very easy to use. Some things I found when profiling my applications:

    Avoid using collections (at least LARGE collections) as properties of Value Objects. I had several types of Value Object Classes in my Cairngorm application, and each had a "children" property which was an ArrayCollection, and was used for filtering. When profiling, I found that these were one of my biggest memory eaters, so I changed my application to instead store the "parentId" as an int and use this for filtering. The memory used was cut drastically. Something like this:

    Old way:

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

    New Way:

    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
    }
    

    I would also suggest removing event listeners when they are no longer needed.