首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试FLEX/AS3内存泄漏

调试FLEX/AS3内存泄漏
EN

Stack Overflow用户
提问于 2009-03-20 05:41:53
回答 4查看 8.3K关注 0票数 6

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

我尝试过使用profiler和它的选项来捕获内存快照,等等--但我的问题仍然存在。我认为使用debug Flash player也有一些已知的问题?但是我在使用发行版时也没有得到joy的支持。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-20 13:31:43

我偶然发现了一些解释如何在Flex Builder中使用Flex Profiler的东西,这对我调试内存泄漏有很大帮助。我绝对建议你试一试。它非常容易使用。在分析我的应用程序时,我发现了一些东西:

避免使用集合(至少是大型集合)作为值对象的属性。我在我的凯恩戈姆应用程序中有几种类型的值对象类,每个类都有一个“ArrayCollection”属性,该属性是一个子对象,用于过滤。在分析时,我发现它们是我最大的内存占有者之一,所以我更改了我的应用程序,改为将"parentId“存储为int,并将其用于过滤。所使用的内存被大幅削减。如下所示:

老方法:

代码语言:javascript
复制
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;
}

新方法:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-03-20 07:21:57

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

  • Understanding Memory Leaks in ActionScript
  • Garbage Collection with Flex and Adobe Air
票数 4
EN

Stack Overflow用户

发布于 2010-03-19 03:28:24

由于这样的问题,我已经开发了一个开源库,它可以帮助监视您在任何给定时间运行的所有事件。它真的很容易实现,我已经在10-15分钟内重构了项目,将它们转换为使用我开发的EventController。

基本上,对于您的场景,我将遍历所有事件,并将它们替换为: obj.addEventListener(...);

致: EC.add(obj,...);

剩下的都是一样的,那就是注册事件,并使用EC.log()让它很容易地在你想要的任何点看到你的所有事件;

所有的细节和文件都在我的网站上,我很想知道这是否对你有帮助,如果你开始使用它。如果你有任何好的或不好的反馈,请随时上传,我会调查的!

网址是:http://fla.as/ec/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/665094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档