Flex

flash中GC机制是异步的2010-01-26 14:42:15| 分类: flasher | 标签:无 |字号大

小 订阅
flash中的GC机制是异步的GC,何谓异步的GC呢?就是你调用了GC后,并不是立即回收内存。

举一个例子,假如一个显示对象,已经没有任何的引用指向他,这个时候将这个对象移除,并且置成null,这个时候是不是这个对象已经从内存中移除了呢?答案是不一定的,如果再调用下GC,这个时候是不是会移除呢?也是不一定的。因为AVM的GC机制是一个比较恶心的机制,那就是他会看内存的使用情况而定,看是否值得去GC。这样一来带来的后果就是,你移除了对象,但是这个对象并没有从内存中移除掉,就算是引用计数器为0了,但是他还是在内存中,因为他只能在下一次内存回收中才能被回收掉。。呵呵

很多人说添加引用的时候,添加弱引用就ok了嘛,这样在监听被移除的时候他就可以被移除了。但是实际情况并不是这样的。假设一个list中的Item,首先看代码段1:

page list

{

//。。。。。

item.addEventListener(MouseEvent.CLICK,onClickHandler,);

}

在flash的帮助中可以看到,在添加坚挺的时候,有useWeakReference这个参数可选,这个参数来指定对侦听器函数的引用是弱引用还是正常引用。通过将此参数设置为 true,可避免侦听器函数在不再需要时仍然存在于内存中的情况。

再看代码段2:

page list.item

{

addEventListener(MouseEvent.CLICK,onClickHandler,);

}

这段代码中的监听是添加在item自身中的,这两种情况下监听效果是一样的,但是对内存回收则不一样。

flashplayer中,添加在外层的监听,也就是在list中的监听,如果设置为弱引用的话,在对象移除后,这个对象会被很好的回收掉。但是如果监听添加在item内部,就算是弱引用,但是还是不能被移除掉。这个时候就必须开发者来移除监听,虽然移除监听是必须养成的习惯。。呵呵

在周日的讨论会上,有人提出利用flash中骇客的方式来进行GC,这个方法是大家现在在通用的方法。呵呵,所以在必要的时候使用骇客来回收下内存还是很有必要的。但是他们提出的在player10中使用骇客法回收内存不如在9中那么明显,这个问题具体为什么不知道。难道是因为10中对循环引用的改进?但是在我的试验中发现效果也是有的啊,只不过没那么明显。。因为10中本身对内存有了一定的控制。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值