网站大量收购独家精品文档,联系QQ:2885784924

AS垃圾回收.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AS垃圾回收

AS垃圾回收 一、Flash Player垃圾回收机制: Flash Player垃圾回收工作是由垃圾回收器(garbage collector)完成的。垃圾回收器是运行在后台的一个进程,它释放那些不再被应用所使用对象所占用的内存。不再被应用所使用的对象是指那些不再会被那些活动着(工作着)的对象所“引用”的对象。在AS中,对于非基本类型(Boolean, String, Number, uint, int)的对象,在对象之间传递的都是对象引用,而不是对象本身。删除一个变量只是删除了对象的引用,而不是删除对象本身。一个对象可以被多处引用,通过这些不同的引用所操作的都是同一个对象。 通过以下两段代码可以了解基本类型和非基本类型对象的差异: 基本类型的值传递: private function testPrimitiveTypes():void { var s1:String=abcd; //创建了一个新字符串s1,值为abcd var s2:String=s1; //String是基本类型,所以创建了一个新的字符串s2,s2的值拷贝自s1。 s2+=efg; //改变s2的值s1不会受影响。 trace(s1:,s1); //输出abcd trace(s2:,s2); //输出abcdefg var n1:Number=100; //创建一个新的number,值为100。 var n2:Number=n1; //Number是基本类型,所以又创建一个新number n2,n2的值拷贝自n1。 n2=n2+100; //改变n2对n1不会有任何影响。 trace(n1,n1); //输出100 trace(n2,n2); //输出200 } 非基本类型对象的引用传递: private function testNonPrimitiveType():void { // 创建一个新对象, 然后将其引用给变量a: var a:Object = {foo:bar} //将上面所创建对象的引用拷贝给变量b(通过变量b建立对对象的引用): var b:Object = a; //删除变量a中对对象的引用: delete(a); // 测试发现对象仍然存在并且被变量b所引用: trace(b.foo); // 输出bar, 所以对象仍然存在 } 对于非基本类型对象,AS3采用两种方法来判定一个对象是否还有活动的引用,从而决定是否可以将其垃圾回收。一种方法是引用计数法,一种方法是标记清除法。 Reference Counting 引用计数法是判定对象是否有活动引用的最简单的一种方法,并且从AS1就开始在Flash中使用。当创建一个对对象的引用后,对象的引用计数就加一,当删除一个引用时,对象的引用技术就减一。如果对象的引用计数为0,那么它被标记为可被GC(垃圾回收器) 删除。例如: var a:Object = {foo:bar} // 现在对象的引用计数为1(a) var b:Object = a; // 现在对象的引用计数为2(a和b) delete(a); // 对象的引用计数又回到了1 (b) delete(b); // 对象的引用计数变成0,现在,这个对象可以被GC释放内存。 引用计数法很简单,并且不会增加CPU开销,可惜的是,当出现对象之间循环引用时它就不起作用了。所谓循环引用就是指对象之间直接或者间接地彼此引用,尽管应用已经不再使用这些对象,但是它们的引用计数仍然大于0,因此,这些对象就不会被从内存中移除。请看下面的范例: 创建第一个对象: var a:Object = {}; // 创建第二个对象来引用第一个对象: var b:Object = {foo:a}; //使第一个对象也引用第二个对象: a.foo = b; // 删除两个活动引用: delete(a); delete(b); 上面的例子中两个活动引用都已被删除,因此在应用程序中再也无法访问这两个对象。但是它们的引用计数都是1,因为它们彼此相互引用。这种对象间的相互引用可能会更加复杂(a引用b,b引用c,c又引用a,诸如此类),并且难以在代码中通过删除引用来使得引用技术为变为0。Flash player 6 和7中就因为XML对象中的循环引用而痛苦,每个XML节点既引用了该节点的子节点,又引用了该节点父节点。因此,这些XML对象永远不会释放内存。好在 player 8增加了一种新的GC技术,叫做标记清除。 标记清除(Mark Sweeping) AS3使用的第二种查找不活动对象的GC策略就是标记清除。 Player从应用的根节点开始(在AS3中通常被称为”根(root)”),遍历所有其上的引用,标记每个它所发现的 对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过

文档评论(0)

htfyzc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档