回收Flash Player内存资源

架的时候遇到了内存资源的问题,一开始我就使用YouYee Player 来进行测试,新加入的Browser用来帮助YouYee Player浏览播放列表,因为基于新框架的设计的原因,所有的弹出窗口方式都模拟了Flex中的机制,利用一个PopUpManager来实现,经过对内存的反应测试反复开启关闭Browser内存剧增,大约每执行一次这样的操作就会消耗400K-500K的内存,虽然Flash Player内部有自动的垃圾回收器,但是却一直没有看到效果。

实际上PopUpManager的执行机制:

声明创建一个新的对象,再将其添加到制定的层(舞台),当该对象关闭的时候监听到事件,把其从舞台移除,并且标记为null。

理论上这样的机制就能让垃圾回收器把废置的Browser回收掉,但是为什么随着操作的进行,内存确完全没有降低呢?理论上我把所有的引用都删除了才对。带着这些问题我查找了许多资料,最后在官方找到了Resource management strategies in Flash Player 9这篇文章,表面上文章只是介绍了垃圾回收的一些机制,并没有涉及到具体的方法,对Sprite类的回收根本就是没有提及,但是里面有一段文字强调了,使用弱引用,在对舞台设置监听的时候使用弱引用,这样可以帮助垃圾回收器进行回收。我一下子想起来实际上框架中的很多组件都对舞台进行了监听,好在他们是利用StageProxy这个代理类来进行监听的,所以我只要把StageProxy这个类中的监听方法写成弱引用,那么问题就解决了。

最后重新进行测试,结果令人满意,内存在增长了一段时间后又开始回落,因为垃圾回收器开始工作了。所以对于Sprite(DisplayObject)类的删除应当注意如下:

1、先利用removeChild将其移出舞台。

2、删除所有的引用,也就是说把其设置为null,而不是使用Delete,Delete仅对动态成员有效。

3、注意所有的Stage监听器,把他们注销,最好的方法是一开始注册监听器的时候就指定为弱引用。

网络上面提供了一些强制的回收机制,个人感觉并不好:通常是利用故意抛出错误的方法来诱使垃圾回收器将其回收。这样做有的时候却是得其反,反而增加了系统的负担。所以还是养成良好的手动回收习惯最好。

loading...