FLEX内存优化技巧集合

转载 2012年03月22日 07:41:02
FLEX内存释放优化原则
1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉;
2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除;
3. 如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null;
4. 本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉;
5. 除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失;
6. 父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除;
7. 如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除;
8. 注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。
9. 父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。
内存泄露举例:
1. 引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null;
2. 系统类泄露:使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用,否则使用此函数的对象将不会被删除;
类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。
3. 效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。
4. SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null;
5. 图片泄露:当Image对象使用完毕后要把source置null;(为测试);
6. 声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null;
内存泄露解决方法:
1. 在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(不管是VO还是组件的都需要删除),删除监听器,调用系统类的清除方法)
先remove再置null, 确保被remove或者removeAll后的对象在外部的引用全部释放干净;
2. 利用Flex的性能优化工具Profile来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息;

总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。

FLEX内存优化技巧集合

FLEX内存释放优化原则1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉; 2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致...
  • bincavin
  • bincavin
  • 2010年04月28日 17:46
  • 104

Flex内存使用技巧

内存问题向来是程序员十分关注的一个方面,也是体现程序健壮性与否.对于C/C++等类C语言来说,编程人员要对程序使用的内存进行比较谨慎的处理,否则很容易导致内存泄露而使得程序运行缓慢甚至失效.而对于Ja...
  • haha0832
  • haha0832
  • 2010年07月26日 00:51
  • 2411

Flex中集合的类型

集合的类型 1、ArrayCollection:一种主要的集合类型 2、XMLListCollection:在包装XML及XMLList对象的基础上添加标准集合功能而成 3、GroupingCo...
  • you23hai45
  • you23hai45
  • 2013年10月26日 21:17
  • 1274

Flex中添加大量组件时内存占用问题

前期在使用FLEX做一个设计器时考虑到了内存和效率问题,由于前期考虑到用户交互,还是使用了Group代替了Sprite作为设计器中组建的跟节点,但设计的图纸越来越大的时候,内存占用和效率的问题越来越突...
  • yin138
  • yin138
  • 2015年09月18日 10:33
  • 569

flex 优化技巧

1、当创建一个数组的时候避免用new操作符,用 var a:Array = [];而不用var a:Array = new Array(); 2、快速的复制一个数组: var copy : A...
  • MR_yuan24
  • MR_yuan24
  • 2012年09月28日 10:39
  • 497

关于Flex里面的对象或者ArrayCollection等数组的深度复制问题

13.11 深度拷贝一个ArrayCollection集合 13.11.1 问题 需要拷贝一个索引数组里的所有项或者从一个对象创建一个新对象。 13.11.2解决 使用mx.utils.Obj...
  • vincent50411
  • vincent50411
  • 2012年10月23日 15:32
  • 879

Flex 求两个ArrayCollection的并集

Flex 求两个ArrayCollection的并集 需求:已知两个ArrayCollection求并集 代码如下: ...
  • wuxiaokaixinguo
  • wuxiaokaixinguo
  • 2013年04月09日 18:06
  • 1152

内存优化技巧

1、小图合大图 最好是一个场景一个大图(小图合大图用的好是可以省内存的——opengl2^n机制 并且还可以提高渲染效率所谓批量渲染 但如果场景为了大图里的一个小图而去加载整个大图 就有点。。。) ...
  • sssssNian
  • sssssNian
  • 2014年10月11日 14:16
  • 546

FLEX 关于遍历 foreach() for()

以下示例使用 for each..in 遍历对象的属性具有的值: var myObject:Object = {firstName:"Tara", age:27, city:"San Francis...
  • wx198977
  • wx198977
  • 2012年02月09日 11:28
  • 2209

Flex4系列一:myeclipse8.5 轻松集成 Flex4 插件(图解)

  查了很多资料才发现高版本的eclipse貌似不支持flex3,所以就装了4.        网上找了半天也没有找到像样的,搞了半天才装上了这个插件。        我真想不明白,为什么多人写这个,...
  • zhll3377
  • zhll3377
  • 2011年03月17日 16:40
  • 12860
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FLEX内存优化技巧集合
举报原因:
原因补充:

(最多只允许输入30个字)