代码之家  ›  专栏  ›  技术社区  ›  Scott Evernden

调试FLEX/AS3内存泄漏

  •  6
  • Scott Evernden  · 技术社区  · 17 年前

    我有一个相当大的Flex&Papervision3D应用程序,可连续创建和销毁对象。它还可以加载和卸载SWF资源文件。当它运行时,SWF会慢慢地消耗内存,直到播放器发出嘎嘎声时消耗大约2GB的内存。显然,我非常确定我放弃了对我不再需要的实例的引用,期望GC能够完成它的工作。但我花了很长时间才弄清楚问题出在哪里。

    我曾尝试使用探查器及其用于捕获内存快照的选项,等等,但我的问题仍然难以解决。我认为使用调试Flash player也存在已知问题?但使用发布版也没有什么乐趣。

    如何使用FLEX/AS3跟踪内存泄漏问题?您使用了哪些策略、技巧或工具来定位消费

    4 回复  |  直到 17 年前
        1
  •  4
  •   igkuk7    17 年前

    我通常在我创建的每个类中实现一个清理方法(因为AS没有析构函数)。我注意到GC的主要问题是事件侦听器。除了Dirkgente所说的之外,还要尽量避免匿名侦听器函数(因为您不能显式删除它们)。以下是一些您可能会发现有用的链接:

        2
  •  3
  •   Eric Belair    17 年前

    ArrayCollection ,并用于筛选。在分析时,我发现它们是我最大的内存消耗者之一,因此我将应用程序改为将“parentId”存储为 int 并将其用于过滤。使用的内存被大幅削减。大概是这样的:

    老办法:

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

    新方式:

    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
    }
    

    我还建议在不再需要事件侦听器时删除它们。

        3
  •  3
  •   Ben Fhala    16 年前

    由于类似的问题,我开发了一个开源库,可以帮助监控您在任何给定时间运行的所有事件。它非常容易实现,我在10-15分钟内重新考虑了项目,将它们转换为使用我开发的EventController。

    基本上,对于您的场景,我将运行所有事件,并从以下位置替换它们:

    致: EC.添加(obj,…);

    该网站是: http://fla.as/ec/

        4
  •  2
  •   dirkgently    17 年前

    如果内存泄漏呈指数级增长,则可能意味着GC无法完成其工作。查看您的代码,看看您可以在哪里减少对象的引用计数(通过将它们设置为 null

    推荐文章