加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flex垃圾回收机制

发布时间:2020-12-15 03:53:46 所属栏目:百科 来源:网络整理
导读:ActionScript3.0垃圾回收器使用两种方法定位无引用的对象,引用计数法和标识清除法。 引用计数法,一种用于跟踪活动对象的较为简单的方法,它从ActionScript1.0开始使用。当你创建一个指向某个对象的引用,该对象的引用计数器 加1;当你删除该对象的一个引用
ActionScript3.0垃圾回收器使用两种方法定位无引用的对象,引用计数法和标识清除法。
  • 引用计数法,一种用于跟踪活动对象的较为简单的方法,它从ActionScript1.0开始使用。当你创建一个指向某个对象的引用,该对象的引用计数器 加1;当你删除该对象的一个引用,该计数器减1。当某对象的计数器变成0,该对象将被标记以便垃圾回收器回收。
    引 用计数法简单,它不会非CPU带来巨大的负担;多数情况下它工作正常。不幸地是,采用引用计数法的垃圾回收器在遇到循环引用时效率不高。
  • 标识清除法,flash player遍历整个对象树,将一切活动对象进行标记,标记过程结束后,没有被标记的就认为可以删除了,当运行GC的时候就把这些对象删除。标识是指强引用。标记-清除法非常准确。但是,由于 Flash Player 遍历你的整个对象结构,该过程对CPU占用太多。Flash Player 9 通过调整迭代标识-清除缩减对CPU的占用。该过程跨越几个阶段不再是一次完成,变成偶尔运行。
内存泄露的原因:
  1. 增加了监听,不需要的时候没有删除;
  2. 没有移除显示列表;
  3. 生成的实例没有销毁;
  4. 。。。

总之,就是存在强引用。

避免方法:

?????? 在不需要用到某个实例的时候,消除与其关联的强引用。比如,移除不再使用的监听器,不再使用的显示对象移除显示列表等。最保险的方法是每个类有自己的GC方法,当不用的时候对应的实例运行一下。


强制Flex垃圾回收:(即著名的hack方式)

通过故意让SWF在运行时出错,然后throw出错误,而同时通过catch error来继续运行SWF文件。而垃圾回收机则会在SWF抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。

下面是我找到一个通过这种hack方式处理垃圾回收的代码:

 
 
  1. package?util ?
  2. { ?
  3. ????????import?flash.net.LocalConnection; ?
  4. ????????import?flash.system.System; ?
  5. ?
  6. ?????????public?class?Memory?{ ?
  7. ????????????????public?function?Memory()??{ ?
  8. ??????????????????????//TO?DO ?
  9. ????????????????} ?
  10. ????????????????static?function?gc()?:?void??{ ?
  11. ????????????????????????try?{ ?
  12. ??????????????????????????new?LocalConnection().connect(?'foo'?); ?
  13. ??????????????????????????new?LocalConnection().connect(?'foo'?); ?
  14. ????????????????????????}?catch?(?e?:?*?)?{} ?
  15. ?????????????????} ?
  16. ?????????????????static?function?get?used()?:?Number?{ ?
  17. ???????????????????????return?System.totalMemory; ?
  18. ??????????????????} ?
  19. ??????????} ?
  20. }?

关于上面代码如何使用,目前大致上有两种使用方法:

1、在项目开始的时候,建立一个timer,然后每个一分钟就执行一次Memory.gc();

2、找一台配置一般的机器,然后运行你要的程序。然后在CPU、Memory占用很高的地方,记录一下当时的内存值,之后再自认为需要的地方(例如位图运算、Effect效果完成后等地方),执行Memory.gc();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读