锁定老帖子 主题:Flash强制垃圾内存回收测试
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-15
java和flash的垃圾回收都是一个比较热门的话题,今天我也用一个例子来测试下flash的强制垃圾回收。主要用到的而一个类是LocalConnection。
在Flash player的debug版本中提供了gc的方法
Flash Player初始化运行时,会向操作系统申请一大块内存,如果程序很小,有可能根本用不了这么多内存,但FP在开始时不考虑这些,大多数情况下,第一次申请的内存总是不够用的。第一次申请的内存大小,与操作系统、浏览器环境有关。
懒惰式指:FP并不会一次把所有可以回收的对象全部回收,它一次仅会回收一部分,如果内存不够用,它会向操作系统申请,如果系统无内存了,它会再次回收,如果全部回收了仍不够用,Game Over! 引用计数指:FP在内部给每个对象标记一个记号,当没有任何对象引用此对象时,它即是可以被回收的;如果一个容器内有许多相互关联的对象,当把这个容器从显示列表中移除,并且置为null后,它也是可以被回收的。
下面是我写的测试代码,主要测试三中情况下内存的使用情况。
package { import flash.display.Sprite; import flash.external.ExternalInterface; import flash.net.LocalConnection; public class MemeryGcTest extends Sprite { private const num:int = 30000; //子元素个数 根据自己的电脑配置来设置 private var parentContainer:Sprite;//父容器 private var childrenRect:Array;//所有子元素的引用 public function MemeryGcTest(){ init(); } private function init() : void{ parentContainer=new Sprite(); addChild(parentContainer); createAllChildrens(); removeAllchildrens(); setChildrenNull(); //doGc(); } /** * 移除所有对象 * */ private function removeAllchildrens():void { removeAllChildrens( ); removeChild(parentContainer); } /** * 设置不用对象为null 否则不会进行垃圾回收 * */ private function setChildrenNull():void{ childrenRect = null; parentContainer = null; } /** * 创建所有子元素 * */ private function createAllChildrens() : void { childrenRect=new Array(); for(var i:int = 0;i<num; i++){ var sprite:Sprite=new Sprite(); childrenRect.push(sprite); sprite.graphics.beginFill(0xff0000); sprite.graphics.drawRect(0+i/50,0,100,100); sprite.graphics.endFill(); parentContainer.addChild(sprite); } } /** * 移除所有子元素 * */ private function removeAllChildrens():void{ for(var i:int=0;i<num;i++){ parentContainer.removeChild(childrenRect[i]); delete childrenRect[i]; } } /** * 强制垃圾回收 * */ private function doGc():void{ try{ var conn1:LocalConnection= new LocalConnection(); conn1.connect("testGc"); var conn2:LocalConnection= new LocalConnection(); conn2.connect("testGc"); }catch(error:Error){ conn1 = null; conn2 = null; } } } }
第一种情况,不设置不用元素为null和强制垃圾回收
private function init() : void{ parentContainer=new Sprite(); addChild(parentContainer); createAllChildrens(); removeAllchildrens(); //setChildrenNull(); //doGc(); }
测试结果如下:
可以看出占用的内存比较高,点击GC按钮内存依然是“居高不下”。
第二种情况,设置不用元素为null但不强制执行垃圾回收。
private function init() : void{ parentContainer=new Sprite(); addChild(parentContainer); createAllChildrens(); removeAllchildrens(); setChildrenNull(); //doGc(); }
测试结果如下:
设置null后虽然刚开始峰值很高,但是Flash Player执行了垃圾回收,很快内存下降到12K。
第三种情况,设置不用对象为null并强制进行垃圾回收。 private function init() : void{ parentContainer=new Sprite(); addChild(parentContainer); createAllChildrens(); removeAllchildrens(); setChildrenNull(); doGc(); }
测试结果如下:
可以看出强制垃圾回收确实执行了。
内存泄露举例:
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3265 次