Sco*_*den 6 apache-flex debugging memory-leaks actionscript-3 papervision3d
我有一个非常大的Flex&Papervision3D应用程序,可以不断创建和销毁对象.它也可以加载和卸载SWF资源文件.当它运行时SWF慢慢消耗内存直到大约2GB,当它晃动播放器时.显然,我很确定我放弃了对不再需要的实例的引用,期望GC能够完成它的工作.但我很想知道问题所在.
我已经尝试使用分析器及其选项捕获内存快照等 - 但我的问题仍然是回避.我认为使用调试Flash播放器也存在已知问题吗?但我也不喜欢使用发布版本.
如何使用FLEX/AS3跟踪内存泄漏问题?您用于定位消费的一些策略,技巧或工具是什么
我偶然发现了一些解释如何在 Flex Builder 中使用 Flex Profiler 的内容,它对我调试内存泄漏有很大帮助。我绝对建议尝试一下。它非常容易使用。我在分析我的应用程序时发现了一些事情:
避免使用集合(至少是大型集合)作为值对象的属性。我的 Cairngorm 应用程序中有多种类型的值对象类,每个都有一个“子”属性,它是ArrayCollection, 并用于过滤。在进行分析时,我发现这些是我最大的内存消耗者之一,因此我更改了我的应用程序,将“parentId”存储为 anint并使用它进行过滤。使用的内存被大幅削减。像这样的东西:
老办法:
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;
}
Run Code Online (Sandbox Code Playgroud)
新方法:
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
}
Run Code Online (Sandbox Code Playgroud)
我还建议在不再需要事件侦听器时将其删除。