我并没有什么特别新奇特的东西,只是总结一下flex里面对于内存回收的一些测试结果
你读起来也许会感觉啰嗦,因为我面向的不是高手,怕说不明白,大家见笑了,另外我也只是个菜鸟,想扔砖的随便扔,我只是希望这点东西能对大家有点用处
猫粮的帖子地址在这
http://flash.9ria.com/thread-367-1-1.html
帖子放在这里,测试结果进行记录
private function enterFrameHandler():void
{
var o:Object = new Object();
}
把这个变量 o 无论是否置空,内存都可以被回收,大概是因为它已经出了作用域了,所以直接销毁
加载外部文件,不关闭,内存回收
private function enterFrameHandler():void { var flvplay:VideoDisplay = new VideoDisplay(); this.addChild(flvplay); flvplay.source = "phone.flv"; flvplay.play(); MyGC.GC(); } |
{
var flvplay:VideoDisplay=new VideoDisplay();
this.addChild(flvplay);
flvplay.source="phone.flv";
flvplay.play();
flvplay.close();
this.removeChild(flvplay);
flvplay=null;
MyGC.GC();
}
但是我实在不明白GC函数里面只是有两个LocalConnection,为什么他们可以让flvplayer的内存回收呢。。。。。o(╯□╰)o
根据帖子的观点,静态函数GC就是回收内存的。。但是不懂为什么LocalConnection可以回收内存。。奇葩
接着测试
如果一个可视化对象里面注册了侦听函数,那么remove掉,效果和删除侦听后是一样的,任务管理器发现,他们会不停的增加,然后停止到一个程度,从profile来看,强制回收内存也是可以成功的,如果我们在后面加上变量为空的代码,效果还是一样,除了作用域,FP也就回收了,不用我们自己YY,不过我感觉删掉那些侦听函数会比较好一些,因为如果你注册的是enterframe事件,强制回收内存总会有那么几个回收不了。
另外,如果在可视化对象里面放timer,timer还在活动,你没有让它close就remove掉了view对象,那就真的内存泄露了,我在的公司开发SNS应用,timer这种东西还是可以用的,我们会在移除时候把timer stop()并且设为null,(当然现在看来不用设置为空的,stop就可以了,但这是算是一种编程规范吧)。我朋友在一个做MMO的公司,他们直接把timer列入黑名单,属于不可以使用的东西。。。 。
写的很乱。。我语文不好,希望大家看了能有点帮助。。我顺便也给自己做点记录