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中本身对内存有了一定的控制。。

你可能感兴趣的:(Flex)