首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flex 3内存泄漏问题

Flex 3内存泄漏问题
EN

Stack Overflow用户
提问于 2013-09-11 23:41:57
回答 3查看 1.1K关注 0票数 0

我们有一个使用多个模块的巨大的flex应用程序。加载和卸载模块的长时间使用存在巨大的内存泄漏问题。

根据所有的搜索和不同的文章,我了解到我需要在卸载时清理对象,删除事件侦听器,停止计时器和处置任何引用。

我一开始是在一个模块中一次选择一个组件。

这就是它的结构。

有一个父应用程序加载一个模块,该模块有多个视图。该组件在mxml中定义,并在视图堆栈中的mxml模块中引用。

这个mxml组件是一个VBox,其中的事件侦听器添加为-

代码语言:javascript
复制
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
         paddingTop="10"
         paddingLeft="10"
         paddingBottom="10"
         paddingRight="10"
         creationComplete="onInit()"
         show="onShow()"
         resize="onResize(event)" ....

在mxml中,有两个从父容器绑定的属性。除了上面的监听器之外,还有一个从外部访问的私有变量-

代码语言:javascript
复制
[Bindable]
private var _model:SModelLocator=SModelLocator.GetInstance(); 

在卸载模块时,我调用此组件中的dispose函数,如下所示-

代码语言:javascript
复制
public function dispose():void
{
    this.removeEventListener(FlexEvent.CREATION_COMPLETE,onInit);
    this.removeEventListener(FlexEvent.SHOW,onShow);
    this.removeEventListener(ResizeEvent.RESIZE,onResize);

    var arr:Array = this.getChildren();
    for(var i:int = 0; i<arr.length;i++)
        delete arr[i];
    this.removeAllChildren();

    _model = null;

    //Properties that are binded from the parent container
    Property1 = null;
    Property2 = null;               

    this.deleteReferenceOnParentDocument(this.parentDocument as IFlexDisplayObject);

}

现在,当我运行profiler并在模块之间切换时,这个组件的实例数量仍然在继续增长。我在profiler上单击了GC Collect,但实例仍然保留。

在作为模块mxml的父容器上,我还尝试在卸载模块时编写以下代码行:

代码语言:javascript
复制
//function call to invoke dispose as above
component1.dispose();
component1 = null;

请帮帮忙。我不确定我在这里遗漏了什么,或者这是不是正确的方法。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-09-12 02:36:10

这不会解决你的问题,但我希望它能有所帮助。

  1. 首先,也是最重要的,仅仅通过查看和重构代码是不会有任何结果的。你需要核心数据来证明你有泄漏,然后它会告诉你泄漏的是什么,这样你就可以修复它。在我使用过的所有内存分析器中,FlashBuilder one仍然是最好的,IntelliJ one一年都不可靠,Adobe Scout只做性能分析。
  2. 从最小的模块开始,并在内存分析器打开的情况下,证明打开和关闭模块(最好是在与主rig隔离的情况下)会导致泄漏。如果是这样的话,我会从删除模块中的所有代码开始,并再次测试它,逐个部分地添加,这将最终引导您进入领先地位。你可以使用最可疑的搜索,在那里你首先处理事件侦听器,等等。
  3. 这个article from Thomas Sugden仍然是我读过的关于flex内存分析的最好的,如果你没有读到它,你应该从头到尾阅读它。
  4. 它值得你花时间编写工具来测试你的模块,谁知道甚至自动化的过程,评估是否有泄漏。这一点很重要,因为有时会有一些不是你的错的漏洞,而Flex框架有一大堆你无法避免的漏洞。

希望这能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2013-09-12 16:05:20

Flash并不总是启动内存清理方法,但它只在你过度占用内存时释放空指针,所以要注意这一障碍。

票数 0
EN

Stack Overflow用户

发布于 2013-09-13 13:46:19

您可能希望尝试不同的容器。我个人在使用VBox时遇到过性能问题。正如之前的用户所说,Flex有一个习惯,就是等到内存达到较高水平后才执行内存清理。

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

https://stackoverflow.com/questions/18745640

复制
相关文章

相似问题

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