- 1、本文档共20页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AS3 内存回收机制一、AS3 内存回收机制 1
二、AS3 内存回收机制 2
三、AS3强制内存回收方法之二 3
四、AS3 释放内存 6
五、AS3中的内存泄露与垃圾回收 8
六、AS3 内存释放优化原则 9
七、as3 内存回收机制测试 10
八、AS3内存优化13条 12
九、AS3的垃圾回收机制详解 14
十、flash as3 内存管理和资源管理 17
十一、轻松几行让你AS3程序不再“内存泄露 18
注意:本资源多半来源于互联网 sword收集
一、AS3 内存回收机制1.什么是垃圾回收器
垃圾收集器是一个后台进程它负责回收程序中不再使用的对象占用的内存。非活动对象就是不再有任何其他活动对象引用它。为便于理解这个概念,有一点非常重要,就是要意识到除了非原生类型(Boolean, String, Number, uint, int除外),你总是通过一个句柄访问对象,而非对象本身。当你删除一个变量其实就是删除一个引用,而非对象本身。
2.as中内存机制的方法
首先是引用计数法:
引用计数法是一种用于跟踪活动对象的较为简单的方法,当你创建一个指向某个对象的引用,该对象的引用计数器加1;当你删除该对象的一个引用,该计数器减1.当某对象的计数器变成0,该对象将被标记以便垃圾回收器回收。
var a:MovlieClip = new MovieClip();
addChild(a); // a的引用计数器为1
var b:MovieClip = a;//a的引用计数器为2
addChild(b);
removeChild(a);
a = null;//a的引用计数器为1
removeChild(b);
b = null; //a的引用计数器为0
其次是标志清除法:
清除法查找非活动对象。FlashPlayer从你的应用程序根对象开始(ActionScript3.0中简称为root)直到程序中的每一个引用,都为引用的对象做标记。 接下来,FlashPlayer遍历所有标记过的对象。它将按照该特性递归整个对象树。并将从一个活动对象开始能到达的一切都标记。该过程结束后,FlashPlayer可以安全的假设:所有内存中没有被标记的对象不再有任何活动引用,因此可以被安全的删除。下图就是那张十分有名的图了:
????????????????????????????????????
绿色引用(箭头)曾被FlashPlayer 标记过程中经过,绿色对象被标记过,白色对象将被回收。
最后就是几种比较常见的内存泄露情况:
???????? 1. 引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null;????????? 2. 系统类泄露:使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除; 类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。??????? 3. 效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。?????? 4. SWF泄露:要完全删除一个SWF要调用它的unload()/unloadAndStop()方法并且把对象置null;??????? 5. 图片泄露:当Image对象使用完毕后要把source置null,加载图片的时候最好draw一个出来,然后将loader处理掉。??????? 6. 声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null;AS3 内存回收机制AS3通过垃圾回收(Garbage Collection)移除不需要的对象,它需要一定条件。
AS3中的对象被回收需要达到一定条件:
1、? 该对象无法通过任何变量访问。也就是没有变量指向该对象,或者指向该对象的变量生命周期结束。
2、? 程序中所有对象所占的内存接近当前系统分配给Flash运行的内存容量时,触发回收机制,移除符合条件1的对象。
这里的第二个条件我们无法控制,没有办法手工强制执行垃圾回收,所有不用的对象都是间接移除,也就是不可能即刻移除。这和ActionScript的Increment Mark And Sweep移除策略有关。不再详细讨论。
那么我们要做的工作就是满足第一个条件,让对象符合被回收的条件。
总结一下如何来满足条件:
1、移除该对象的所有引用,也就是所有引用该对象的变量赋值为nul
文档评论(0)