我有一个非常大的Flex & Papervision3D应用程序,它不断地创建和销毁对象。它还可以加载和卸载SWF资源文件。当它运行的时候,SWF会慢慢地消耗内存,直到2 2GB,当它使播放器崩溃的时候。显然,我非常确定我放弃了对不再需要的实例的引用,并期望GC能够完成它的工作。但我花了很长时间才弄清楚问题出在哪里。
我尝试过使用profiler和它的选项来捕获内存快照,等等--但我的问题仍然存在。我认为使用debug Flash player也有一些已知的问题?但是我在使用发行版时也没有得到joy的支持。
如何使用FLEX/AS3追踪内存泄漏问题?您使用过哪些策略、技巧或工具来定位消费
发布于 2009-03-20 13:31:43
我偶然发现了一些解释如何在Flex Builder中使用Flex Profiler的东西,这对我调试内存泄漏有很大帮助。我绝对建议你试一试。它非常容易使用。在分析我的应用程序时,我发现了一些东西:
避免使用集合(至少是大型集合)作为值对象的属性。我在我的凯恩戈姆应用程序中有几种类型的值对象类,每个类都有一个“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
}我还建议在不再需要事件侦听器时将其删除。
发布于 2009-03-20 07:21:57
我通常在我创建的每个类中实现一个清理方法(因为AS没有析构函数)。我注意到GC的主要问题是事件侦听器。除了dirkgently所说的之外,还要尽量避免使用匿名侦听器函数(因为您不能显式地删除它们)。这里有几个你可能会觉得有用的链接:
发布于 2010-03-19 03:28:24
由于这样的问题,我已经开发了一个开源库,它可以帮助监视您在任何给定时间运行的所有事件。它真的很容易实现,我已经在10-15分钟内重构了项目,将它们转换为使用我开发的EventController。
基本上,对于您的场景,我将遍历所有事件,并将它们替换为: obj.addEventListener(...);
致: EC.add(obj,...);
剩下的都是一样的,那就是注册事件,并使用EC.log()让它很容易地在你想要的任何点看到你的所有事件;
所有的细节和文件都在我的网站上,我很想知道这是否对你有帮助,如果你开始使用它。如果你有任何好的或不好的反馈,请随时上传,我会调查的!
网址是:http://fla.as/ec/
https://stackoverflow.com/questions/665094
复制相似问题