[转]Flex开发中可能出现内存泄漏的…



收集了不少的会导致内存泄露的情况:
事件监听:
对父级对象加了监听函数,会造成内存泄露,例:
override protected function mouseDownHandler(…):void {
systemManager.addEventListener(“mouseUp”, mouseUpHandler);
……
}
解决:
在销毁对象的时候,remove掉这些监听,虽然弱引用也可以避免这些问题,但自己掌控感觉更好。
但以下几种情况不会造成内存泄露:
弱引用:someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, 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定义或是 这样的定义,那么这个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还需改善.

收集了不少的会导致内存泄露的情况:
事件监听:
对父级对象加了监听函数,会造成内存泄露,例:
override protected function mouseDownHandler(…):void {systemManager.addEventListener(“mouseUp”, mouseUpHandler);……}解决:在销毁对象的时候,remove掉这些监听,虽然弱引用也可以避免这些问题,但自己掌控感觉更好。
但以下几种情况不会造成内存泄露:
弱引用:someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, 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定义或是 这样的定义,那么这个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还需改善.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flex,内存回收主要依赖于垃圾回收器(Garbage Collector)自动处理。垃圾回收器会自动检测和释放不再使用的内存,以避免内存泄漏和提高应用程序的性能。 以下是一些在Flex帮助垃圾回收器进行内存回收的常见方法: 1. 解除引用(Release References):确保不再使用的对象没有被其他对象引用。当对象不再被引用时,垃圾回收器会自动将其标记为可回收,并在下一次垃圾回收时释放内存。 2. 删除事件监听器(Remove Event Listeners):如果对象注册了事件监听器(Event Listener),在不再需要该对象时,务必记得手动删除对应的事件监听器。否则,即使对象本身没有被引用,由于事件监听器的存在,垃圾回收器可能无法释放相关的内存。 3. 关闭和释放资源(Close and Release Resources):在使用文件、网络连接等资源时,确保在不再需要时及时关闭和释放这些资源。避免资源的泄漏和占用过多的内存。 4. 避免循环引用(Avoid Circular References):循环引用指的是对象之间相互引用,导致它们无法被垃圾回收器释放。尽量避免出现循环引用的情况,或者在不需要时手动断开循环引用。 需要注意的是,Flex的垃圾回收是自动进行的,无需手动管理每个对象的内存释放。遵循良好的编程实践和内存管理原则,可以帮助垃圾回收器更有效地工作,并确保应用程序的内存使用保持在合理的范围内。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值