我们有一个使用多个模块的大型Flex应用程序。在加载和卸载模块的长时间使用中有一个巨大的内存泄漏问题。
基于所有的搜索和不同的文章,我明白我需要清理卸载对象,删除事件侦听器,停止计时器和处理任何引用。
我开始时在一个模块中一次选择一个组件。
这是它的结构。
有一个加载模块的父应用程序,该模块具有多个视图。组件在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;
请帮助。我不确定我在这里错过了什么,或者即使这是正确的方法。
- 谢谢-谢谢
3条答案
按热度按时间zpqajqem1#
这不会解决你的问题,但我希望它有帮助。
1.首先也是最重要的一点是,仅仅通过查看和重构代码并不能取得任何进展。你需要核心数据来证明你有一个漏洞,然后它会告诉你是什么漏洞,这样你就可以修复它。在我使用过的所有内存分析器中,FlashBuilder仍然是最好的,IntelliJ的一年都不可靠,Adobe Scout只做性能分析。
1.从最小的模块开始,打开内存分析器,证明打开和关闭一个模块(最好是在隔离主装备的情况下)会造成泄漏。如果是这样的话,我会从模块中删除所有代码,然后再次测试,一部分一部分地添加,最终将引导您找到线索。您可以使用最佳嫌疑人搜索,首先处理事件侦听器等。
1.托马斯Sugden的这篇文章仍然是我读过的关于灵活内存分析的最好的文章,如果你还没有读过的话,你应该从头到尾读一读。
1.值得你花时间去编写工具来测试你的模块,谁知道甚至自动化评估是否有泄漏的过程。这很重要,因为有时候泄漏不是你的错,Flex框架有一堆你无法避免的泄漏。
希望这对你有帮助。
kq0g1dla2#
您可能需要尝试不同的容器。我个人在使用VBox时遇到过性能问题。正如之前的用户所说,Flex有一个习惯,即在内存达到高水平时才执行内存清理。
qgelzfjb3#
Flash并不总是启动内存清理方法,但它只在您过度占用内存时释放空指针,所以请注意这一障碍。