AS3垃圾回收

第一招:以静置动 (虽然显然是节约时间....貌似直接用方法反而有比这样更耗内存????)

for(var i=0;i<Array.length;i++) ==> for (var i=0,var j=Array.length;i<j;i++)

第二招:自生自灭   直接方法<实例方法调用(内存)<静态方法调用(时间)

一般强制内存回收 直接一个类:

/**
* 强制内存回收garbage collector
* @author telds
* @version 0.0.1
*/

package com.telds.utils {
import flash.net.LocalConnection;

public class GC {
   public static function clear():void{
            try {
                var lc1:LocalConnection = new LocalConnection();
                var lc2:LocalConnection = new LocalConnection();
                lc1.connect('name');
                lc2.connect('name2');
            } catch (e:Error) {
            }
        }

public function clear():void{
            try {
                var lc1:LocalConnection = new LocalConnection();
                var lc2:LocalConnection = new LocalConnection();
                lc1.connect('name');
                lc2.connect('name2');
            } catch (e:Error) {
            }
        }
}
}

改进为

public interface IGC{

        function gc():Boolean;

}

public class ClassA implements IGC{

     public function gc():Boolean{

           //TODO:

    }

}

第三招:即来即去 (群体魔法....)

这招直接文字描述

定义一个接口,声明:获取实例、指针归零、销毁

定义一个类,声明:缓存字典/数组变量、指针变量、继承上述接口

用法:

声明任何变量 引用改类获取实例、当缓存无此实例,再声明。

第四招:有“借”有“还”

此招不提也罢,就是事件or字典用了就要还.......

===================================================自评========================

法1.就此

法2.灵活,不过直接在构造函数内制造单纯回收,请忽视

法3.群体,单体请忽视。

法4............

关于垃圾回收,我来解释下为什么LocalConnection可以实现垃圾回收

我来解释下为什么LocalConnection可以实现垃圾回收.
其实LocalConnection与垃圾回收是没有直接关系的.
这个做法的原理在于垃圾回收的时间尽管不确定,但是,只要程序抛出错误,就会运行一次垃圾回收器.这里使用LocalConnection两次connect同一个连接,第二次将发生运行时错误(#1034,LocalConnection已经连接上).于是就报错了.垃圾回收器自动运行.
至于为什么网上流传的版本都是LocalConnection,我个人觉得,可能是因为这个LocalConnection在AS3的应用中相对比较少出现,而且跟其他代码相比,这个运行时错误不容易与其他代码发生冲突.

//

我的方法在我的程序上测试过,在相同的内存申请中,第一次调用gc()后,内存好像没有被释放,但第二次进行相同的内存申请却并没有增加内存的用量,CPU使用也相对稳定,可以这样说,系统的确是回收了垃圾,但没有直接把回收的内存交还给操作系统,所以在第二次申请中内存用量没有上升。
而在没有用gc()的情况下,每调用一次都会增加内存用量,CPU占有也随之提高。

//

LocalConnection以及System.totalMemory这样的东西。
都是封装在底层的实现中。
如果是windows有相应的C++底层实现,官方没有公开这个资料自然也没有说明,不然就不叫Hack
但是我觉得这是一个不稳定的做法,因为针对不同的系统,相对的底层实现也不同。

今天闲着看了看Flash的内存垃圾回收机制,发现网上有这么个用法:   


他们据说是AVM2在某些错误发生的时候一定会启动一次GC,所以只要手动引发一次错误就可以了。

我也做了一下实验,new 出来100 个MovieClip,然后手动将每一个置NULL,然后再生成,反复10来次。 发现基本上垃圾对象只有在大于1000个左右才会被主动回收(也不一定是1000个,应该与movieClip大小有关系)。

然后我尝试在每次的dispose的结尾插入上述的代码,发现基本上每一次的dispose都会触发一次GC,的确是有用。但是这种手动触发的GC不知道在大型的项目中到底有没有实际用途,是否会导致一些其他的副作用,例如影响某些代码的运行之类的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值