- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)”),遍历所有其上的引用,标记每个它所发现的
对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过
您可能关注的文档
最近下载
- Unit 6 Rain or Shine (第3课时) 课件人教版(2024)英语七年级下册.pptx VIP
- 港珠澳大桥岛隧工程沉管隧道混凝土质量控制措施.pdf
- 2025年中考数学复习热搜题速递之尺规作图(2024年7月).docx
- 股市风险预警机制-深度研究.pptx
- 政策解读2025年中央一号文件PPT.pptx VIP
- 5.0MPa路面抗折混凝土配合比.docx VIP
- 17J927-1 车库建筑构造(OCR).pdf VIP
- XX市疾病预防控制中心-艾滋病HIV筛查实验室管理手册_精品.doc
- 2025年春季小学学校德育工作计划(1975字).docx VIP
- 渤海水泥厂包装车间除尘系统设计.docx
文档评论(0)