0

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

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

我通过在其中一个模块中一次拿起一个组件来开始这一点。

这是它的结构。

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

这个 mxml 组件是一个添加了事件侦听器的 VBox -

<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 中的父容器绑定的。除了上述侦听器之外,还有一个从外部访问的私有变量 -

[Bindable]
private var _model:SModelLocator=SModelLocator.GetInstance(); 

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

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);

}

现在,当我运行分析器并在模块之间切换时,该组件的实例数量仍在继续增长。我在分析器上单击了 GC Collect,但实例仍然存在。

在模块 mxml 的父容器上,我还尝试在卸载模块时编写以下行 -

//function call to invoke dispose as above
component1.dispose();
component1 = null;

请帮忙。我不确定我在这里缺少什么,或者即使这是正确的方法。

谢谢。

4

3 回答 3

1

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

  1. 首先,仅通过查看和重构代码,您将无法取得任何进展。您需要证明您有泄漏的核心数据,然后它会告诉您泄漏的内容,以便您修复它。在我使用过的所有内存分析器中,FlashBuilder 仍然是最好的,IntelliJ 一年不可靠,Adobe Scout 只进行性能分析。

  2. 从最小的模块开始,并在内存分析器打开的情况下证明打开和关闭模块(最好与主装备隔离)会产生泄漏。如果是这种情况,我会首先从模块中删除所有代码,然后再次对其进行测试,然后逐部分添加,这将最终引导您。您可以使用最佳嫌疑人搜索,首先解决事件侦听器等问题。

  3. Thomas Sugden的这篇文章仍然是我读过的关于弹性内存分析的最好的文章,如果你还没有读过,你应该从头到尾阅读它。

  4. 值得您花时间编写允许您测试模块的工具,谁知道甚至可以自动化评估是否存在泄漏的过程。这很重要,因为有时会有一些泄漏不是您的错,Flex 框架有很多您无法避免的泄漏。

希望这有帮助。

于 2013-09-11T18:36:09.760 回答
0

Flash 并不总是启动内存清除方法,但它只会在您过度占用内存时释放空指针,所以请注意这个障碍。

于 2013-09-12T08:05:19.590 回答
0

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

于 2013-09-13T05:46:18.920 回答