AS3垃圾回收

来源:互联网 发布:全球股指行情软件 编辑:程序博客网 时间:2024/06/02 11:54

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

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不知道在大型的项目中到底有没有实际用途,是否会导致一些其他的副作用,例如影响某些代码的运行之类的。

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩子上课不专心怎么办 孩子好动不专心怎么办 一年级上课不听讲怎么办 小孩不专心听讲怎么办 小孩上课不集中怎么办 一年级上课不专心怎么办 上课不认真听课怎么办 高中上课不专注怎么办 上课听不进去怎么办 孩子上课容易走神怎么办 上跆拳道不听讲怎么办 孩子写字很慢怎么办 孩子写字慢该怎么办 小孩不遵守纪律怎么办 初一孩子上课走神怎么办 转学学籍转不了怎么办 孩子学习不专心怎么办 高中上课老走神怎么办 儿童演出前紧张怎么办 幼儿做事不认真怎么办 上课讲话的孩子怎么办 孩子不用心读书怎么办 小孩读书不专心怎么办 幼儿争抢玩老师怎么办 小孩做作业发呆怎么办 宝宝上课不认真怎么办 孩子不认真听课怎么办 小孩不认真听课怎么办 小孩叛逆家长该怎么办 小孩心里有问题怎么办 孩子做作业发火怎么办 小孩上课小叨咕怎么办 孩孑读书读不走怎么办 幼儿分离焦虑症怎么办 忍不住想打孩子怎么办 控制不住打骂孩子怎么办 总忍不住打孩子怎么办 生气打了孩子怎么办 小孩有心绞痛的怎么办 儿童爱感冒咳嗽怎么办 心情总是很烦躁怎么办