flex垃圾回收机制

来源:互联网 发布:windows任务管理器画图 编辑:程序博客网 时间:2024/06/07 06:50
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.                 public static function gc() : void  {  
  11.                         try {  
  12.                           new LocalConnection().connect( 'foo' );  
  13.                           new LocalConnection().connect( 'foo' );  
  14.                         } catch ( e : * ) {}  
  15.                  }  
  16.                  public static function get used() : Number {  
  17.                        return System.totalMemory;  
  18.                   }  
  19.           }  

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

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

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


0 0