Flex 中可能导致内存泄露的地方

收集了不少的会导致内存泄露的情况:

事件监听:

对父级对象加了监听函数,会造成内存泄露,例:

override protected function mouseDownHandler(…):void {
systemManager.addEventListener(“mouseUp”,mouseUpHandler);
......
}

解决:
在销毁对象的时候,remove掉这些监听,虽然弱引用也可以避免这些问题,但自己掌控感觉更好。

但以下几种情况不会造成内存泄露:

  • 弱引用:someObject.addEventListener(MouseClick.CLICK,handlerFunction,false,true);
  • 对自己的引用:this.addEventListener(MouseClick.CLICK,handlerFunction);
  • 子对象的引用:
    private var childObject:UIComponent = new UIComponent;
    addChild(childObject);
    childObject.addEventListener(MouseEvent.CLICK,clickHandler);
    

总之…有addEventListener,就removeEventListener一下吧,要为自己做的事负责~哈哈

清除引用

remove掉子对象后并不会删除该对象,他还保留在内存中,应该将引用设置为null

removeChildren(obj);
obj = null;

静态成员

Class (或MXML)中有:

public static var _eventService : MyService=new MyService();

解决:在dispose时,需要设置:

_eventService =null;

module (未解决)

moduleLoader unloadModule后
ModuleInfo 并不会被GC.
Garbage Collection in a MultiCore Modular Pipes Application
这篇文章介绍了一种GC策略,感觉对于ModuleInfo 的GC无效。
(未尝试、未遇到)

CSS样式

module 中如果使用了shell的CSS定义或是<mx:Style> 这样的定义,那么这个module将不能GC.
弹出的窗口应该是同样的结果.
解决方法,使用动态CSS文件
module init中

StyleManager.loadStyleDeclarations("css/myStyle.swf");

module dispose中

StyleManager.unloadStyleDeclarations("css/myStyle.swf");

TextInput/Textarea(未解决)

如果module中有window使用了TextInput/Textarea控件,不点击没有问题,只要点上去,那么很遗憾了,module和所在窗体将不能被GC.
这个BUG非常严重,目前还没有解决方法。
memory leak when using TextInput and TextArea when click the keyboard 这里面附加的解决方法无效。
通过profiler分析,应该和Focusmanager有关,只有一点击就不会释放。

CursorManager.setCursor

使用了

cursorID = CursorManager.setCursor(iconClosed);

dispose时要

CursorManager.removeCursor(cursorID); 

Bitmap

如果使用Bitmap,结束时需要调用其dispose方法,否则内存消耗巨大。
另外,BitmapData是可以共享使用的,多个Bitmap可以使用同一BitmapData,节省不少内存。

var bmp:Bitmap  =new Bitmap();

........

if (bmp.bitmapData!=null) {
    bmp.bitmapData.dispose();
}

Image

包含了Image对象时,在removeChildren时会造成不能释放(测试多次,结果不一,建议还是做如下处理)。
解决:

img.source = null;
this.removeChild(img);
img = null;

Loader、SWFLoader、声音、视频、Effect等…

  • 如果是加载SWF文件,先停止播放。
  • 停止声音的播放
  • 停止正在播放的影片剪辑(Movieclip)
  • 关闭任何连接的网络对象,例如Loader正在加载,要先close。
  • 取消对摄像头或者麦克风的引用
  • 取消事件监听器
  • 停止任何正在运行的定时器,clearInterval()
  • 停止任何Timer对象,timer.stop()
  • 停止正在播放的效果(Effect)

其他

binding也疑似有memory leak 问题。

引用以及内存泄露相关博文和资料:
http://blogs.adobe.com/aharui/2007/03/garbage_collection_and_memory.html
http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/
http://www.cnblogs.com/janyou/archive/2008/11/25/1340753.html
http://www.dreamingwell.com/articles/archives/2008/05/understanding_m.php

总结:由于之前Flash一直是在网页上使用,一般网页都是看完就关掉的,估计Adobe在内存回收这块也没有下太大的功夫,现在AIR的出现使得内存管理也相当重要了,并且,AIR本身对内存的消耗就相当大,一个没有任何内容的初始创建的AIR程序,就得占掉10-20M+的内存…AIR还需改善.

相关文章

一:display:flex布局display:flex是一种布局方式。它即可以...
1. flex设置元素垂直居中对齐在之前的一篇文章中记载过如何...
移动端开发知识点pc端软件和移动端apppc端软件是什么,有哪些...
最近挺忙的,准备考试,还有其他的事,没时间研究东西,快周...
display:flex;把容器设置为弹性盒模型(设置为弹性盒模型之后...
我在网页上运行了一个Flex应用程序,我想使用Command←组合键...