辛佳雨的专栏

我的思想,凭空游弋

用户操作
[即时聊天] [发私信] [加为好友]
辛佳雨ID:microrain
391747次访问,排名140,好友23人,关注者78人。
咨询顾问
microrain的文章
原创 95 篇
翻译 2 篇
转载 40 篇
评论 883 篇
辛佳雨的公告

最近评论
chinalong1115:Adobe太强大了,以后Flex肯定会成为互联网应用的主流技术的。
杨文:我学了有很大进步
wsure:asd
cqg1220:电视墙
Nore:有本事就Linux OOo gcc(g++) konqueror(or Firefox) etc.

http://www.chinaunix.net/jh/4/16102.html
文章分类
收藏
    相册
    相关图片
    真实的我
    朋友
    周筠@博文视点(RSS)
    杨福川 写书/译书都找他(RSS)
    葛涵涛@CSDN(RSS)
    闫辉(RSS)
    陈瑞江@CSDN(RSS)
    霍泰稳的BLOG(RSS)
    龙如俊blog(RSS)
    网站
    CSDN下载频道
    代码中国网(RSS)
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 FLEX内存优化收藏

    新一篇: 著名的所见即所得编辑器 TinyMCE 终于发布了3.0 正式版 | 旧一篇: 资深猎头眼中的优质简历是如何炼成的?


    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来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息;


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

     

    发表于 @ 2008年02月24日 10:29:00|评论(loading...)|收藏

    新一篇: 著名的所见即所得编辑器 TinyMCE 终于发布了3.0 正式版 | 旧一篇: 资深猎头眼中的优质简历是如何炼成的?

    评论

    #☆李逍遥☆ 发表于2008-03-10 15:48:37  IP: 58.211.28.*
    这篇文章是我写的, 转载的时候请著名原创作者,尊重版权, 谢谢


    ------------☆李逍遥☆
    #microrain 发表于2008-03-11 01:39:22  IP: 221.200.24.*
    文章已标注是转载,因为是在网上找到的,没有看到原作者的信息,也就没有标注。
    #小桂 发表于2008-05-07 13:33:57  IP: 222.128.26.*
    这篇文章的作者对flex 了解多少?我想知道。你觉得写flex把以上这些全部都要注意到那as3还有人写吗?你自己测试把一个SWFLoader放上去,然后反复load,内存一直增加。强行system.gc也无法回收,这个如何解释?这些问题我问过Adobe公司,他们都无法解决,只说希望等待下个版本 player优化内存回收机制.
    #千里之行 发表于2008-05-08 23:11:12  IP: 123.129.94.*
    回小桂:
    可以看出写这篇文章的人对虚拟机是有一定了解的。不知你找adobe的什么人去问的问题?是他们的资深开发人员吗?普通技术人员能做这种核心技术的开发吗?
    不知你为什么要反复load,如果是相同的资源为什么不用rsl?或者采用单例模式,杜绝重复载入。
    如果你load而又不unload,内存当然增加。如果unload内存没减少,是因为虚拟机还没来完成一系列的检查。
    #wsure 发表于2008-10-28 10:14:53  IP: 210.72.232.*
    asd
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 辛佳雨