调试FLEX/AS3内存泄漏问题

6
我有一个相当庞大的Flex&Papervision3D应用程序,它会不断地创建和销毁对象。它还会加载和卸载SWF资源文件。在运行过程中,SWF会缓慢消耗内存,直到达到2GB时,播放器就会崩溃。很明显,我已经释放了我不再需要的实例的引用,并期望GC执行其工作。但是我非常困惑,无法确定问题出在哪里。
我尝试使用分析器和其捕获内存快照的选项等,但我的问题仍然无法解决。我认为使用调试Flash播放器也存在已知问题?但是我也无法通过使用发布版本来解决问题。
如何使用FLEX/AS3跟踪内存泄漏问题?你都使用了哪些策略、技巧或工具来定位内存泄漏?
4个回答

4

我通常在每个类中都实现一个清理方法(因为AS没有析构函数)。 我注意到GC的主要问题是事件侦听器。 除了dirkgently所说的之外,还要尝试避免使用匿名侦听器函数(因为您无法显式删除它们)。 这里有几个链接可能会对您有用:


http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/arguments.html#callee - Jotham

3
我偶然发现了一篇关于如何在Flex Builder中使用Flex Profiler的文章,对我调试内存泄漏问题非常有帮助。我强烈建议你们也试试。它非常易用。在分析我的应用程序时,我发现以下几点:
避免将集合(至少是大型集合)作为值对象的属性使用。在我的Cairngorm应用程序中,我有几种类型的值对象类,每个类都有一个“children”属性,该属性是一个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
因为这样的问题,我开发了一个开源库,帮助监控您正在运行的所有事件。它非常容易实现,我已经重构了一些项目,在10-15分钟内将它们转换为使用我开发的EventController。
基本上对于您的情况,我会遍历所有事件,并将它们从: obj.addEventListener(...);
替换为: EC.add(obj,...);
其余部分相同,这将注册事件并使其非常容易在任何时候使用EC.log()查看所有事件。
所有详细信息和文档都在我的网站上,我很想知道这是否对您有所帮助,如果您开始使用它,请随时提供任何好或坏的反馈意见,我会考虑改进!
网站是: http://fla.as/ec/

2

如果您的内存泄漏呈指数增长,那么很可能是垃圾回收未能发挥作用。检查您的代码,并查看您是否可以减少对象引用计数(通过将它们设置为null)。使事件处理程序变弱。重新进行性能分析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接