我有一个非常大的Flex& Papervision3D应用程序不断创建和销毁对象.它也可以加载和卸载SWF资源文件.当它运行时SWF慢慢消耗内存直到大约2GB,当它晃动播放器时.显然,我很确定我放弃了对不再需要的实例的引用,期望GC能够完成它的工作.但我很想知道问题所在.
我已经尝试使用分析器及其选项捕获内存快照等 – 但我的问题仍然是回避.我认为使用调试Flash播放器也存在已知问题吗?但我也不喜欢使用发布版本.
如何使用FLEX / AS3跟踪内存泄漏问题?您用于定位消费的一些策略,技巧或工具是什么
解决方法
我偶然发现了解释如何在Flex Builder中使用Flex Profiler的内容,这对我调试内存泄漏是一个巨大的帮助.我肯定会建议尝试一下.它非常易于使用.我在分析应用程序时发现的一些事情:
避免使用集合(至少是LARGE集合)作为Value Objects的属性.我在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 }
我还建议在不再需要时删除事件监听器.