flex草芥回收机制.
2011年07月19日
原文Understanding garbage collection inFlashPlayer 9 翻译 现在我临时在琢磨ActionScript3.0,它的力气让我很兴奋。它的原生厉行速度带来众多可能(此句原文The raw execution speed by itimmolation provides so many possibilities. raw初衷未加工,原始的,这里的含义是点拨入AVM2尔后,ActionScript3.0在厉行速度上有了很大长进,因而使扶持更混杂的组件成为可能,译者注)。它引入了E4X、sockets、byte 数组对象、新的揭示列表模型、正则表白式、正式化的事件和讹谬模型以及其它个性,它是一个令人炫目标大杂烩。 宏伟的力气意味着宏伟的义务,这对ActionScript3.0来说一点没错。引入这些新控件带来一个副作用:草芥采集器不再扶持积极为你采集草芥等假想。也即便说Flash开发者转到ActionScript3.0尔后必需对关于草芥采集如何工作以及如何编程使其工作更加管用具有较深入的会意。未曾这方面的知识,即便创立一个看起来很容易的游戏或利用过程也会揭示SWF文件内存败露、耗光所有系统资源(CPU/内存)导致系统挂起甚至机抬举启。 要点会如何优化你的ActionScript3.0代码,你率先要点会草芥采集器如何在FlashPlayer 9中工作。Flash有两种措施来查找非行动对象并移除它们。本文解释这两种技巧并描写它们如何波及你的代码。 本文结尾你会找到一个运行在FlashPlayer9中的草芥采集器模仿过程,它生动演示了这里解释过的观念。 关于草芥采集器草芥采集器是一个后台历程它负责回收过程中不再利用的对象挪借的内存。非行动对象即便不再有任何等他行动对象引用 它。为便于会意这个观念,有一点极其重要,即便要意识到除非非原生种类(Boolean, String, Number, uint, int例外),你总是穿越一个句柄拜会对象,而非对象本身。当你剔除一个变量其实即便剔除一个引用,而非对象本身。 以下代码很轻率解释这一点: ActionScript代码 // create a new object, and put a reference to it in a: var a:Object = {foo:"bar"} // copy the reference to the object into b: var b:Object = a; // delete the reference to the object in a: delete(a); // check to see that the object is still referenced by b: trace(b.foo); // traces "bar", so the object still exists.
万一我改换上述示例代码将b也剔除,它会使我创立的对象不再有行动引用并期待对草芥采集器回收。ActionScript3.0 草芥回收器利用两种措施定位无引用的对象 : 引用计数法和标识打扫法。 引用计数法引用计数法是一种用于追寻行动对象的较为容易的措施,它从ActionScript1.0开始利用。当你创立一个指向某个对象的引用,该对象的引用计数器加1;当你剔除该对象的一个引用,该计数器减1。当某对象的计数器变成0,该对象将被符号以便草芥回收器回收。 这是一个例子: ActionScript代码
引 用计数法容易,它不会非CPU带来宏伟的担负;多数情形下它工作正常。不幸地是,批准引用计数法的草芥回收器在遭到循环引用时效率不高。循环引用是指对象 穿插引用(直接、或穿越其他对象间接告终)的情形。即方便用过程不再引用该对象,它的引用计数器依旧大于0,因而草芥采集器永远无法采集它们。下面的代码 演示循环引用是怎么回事: ActionScript代码
上 述代码中,所有利用过程中行动的引用都被剔除。我未曾任何措施在过程中再拜会这两个对象了,但这两个对象的引用计数器都是1,因为它们互相引用。循环引用 还能够更加负责 (a 引用 c, c引用b, b引用a, 等等) 并且难于用代码处理。FlashPlayer 6 和 7的XML对象有许多循环引用问题: 每个 XML 节点被它的孩子和父亲引用,因而它们从不被回收。走运的是FlashPlayer 8 添置了一个叫做标识-打扫的新草芥回收技巧。标识-打扫法ActionScript3.0 (以及FlashPlayer 8) 草芥回收器批准第2种计策标识-打扫法查找非行动对象。FlashPlayer从你的利用过程根对象开始(ActionScript3.0中简称为root)直到过程中的每一个引用,都为引用的对象做符号。 接下来,FlashPlayer遍历所有符号过的对象。它将按照该个性递归全副对象树。并将从一个行动对象开始能到达的一切都符号。该过程告终后,FlashPlayer能够平安的假想:所有内存中未曾被符号的对象不再有任何行动引用,因而能够被平安的剔除。图1 演示了它如何工作:绿色引用(箭头)曾被FlashPlayer 符号过程中穿越,绿色对象被符号过,白色对象将被回收。 Figure 1.FlashPlayer批准符号打扫措施符号不再有行动引用的对象 符号-打扫法极其准确。然而,由于FlashPlayer 遍历你的全副对象构造,该过程对CPU挪借太多。FlashPlayer 9 穿越调剂迭代标识-打扫收缩对CPU的挪借。该过程横亘几个阶段不再是顺次告终,变成偶尔运行。 缓期(厉行)草芥回收器和不确定性FlashPlayer 9草芥回收器垄断是缓期的。这是一个要点会的极其重要的观念:当你的对象的所有引用剔除后,它不会被即刻剔除。而是,它们将在未来一个不确定的时刻被 剔除(从开发者的角度来看)。草芥采集器批准一系列启迪式技巧诸如察看RAM分配和内存栈空间大小以及其他措施来定夺何时运行。作为开发者,你定然接受这 样的事实:不可能懂得非行动对象何时被回收。你还定然懂得非行动对象将继续存在直到草芥采集器回收它们。因而你的代码会继续运行(enterFrame 事件会继续)、声音会继续播送、装载还会发生、其它事件还会引发等等。 记住,在FlashPlayer中你无权扼制何时运行草芥采集器去回收对象。作为开发者,你必需尽可能把你的游戏或利用过程中无用的对象利用打扫。管教无用对象的计策将会在我的另一篇文章关键推荐:FlashPlayer 9的资源管教计策。 下图模仿草芥回收器中总内存(包括行动对象和非行动对象的和,译者注)的锯齿状局部(点击图2或下方链接)。锯齿 的发生是由于草芥回收器厉行回收(原文厉行 打扫,疑为厉行回收)。点击该图并当心,按下空格键来间断或重启,并在运行时按住up/down键头以扼制内存利用倾向。 http://om/devnet/flashplayer/articles/garbage_coll ection.html#Figure 2.Garbage collection simulation Garbage collection simulation正如下面演示的一样(单击图3或下方链接),拖动对象(圆角矩形)到桌面并发生它们之间的引用(利用连线,译者注)。点击run reference或mark and sweep按钮以察看哪些对象会被回收。对象上有标识到该对象的引用个数。 http://om/devnet/flashplayer/articles/garbage_coll ection.html#Figure 3.Garbage collection simulation: mark and sweep Garbage collection simulation: mark and sweep从这里通往何方?会意草芥回收机制是编写优化代码的重要前提。优化的代码保证你的Flash项目在客户机器上运行时不会带来大的冲击。阅读更多相干文章,FlashPlayer 9中的资源管教计策,或拜会Flash开发者中心以及FlashPlayer开发者中心。 也能够察看我的blog gskinner.com 阅读关于弱引用的文章并下载我写的一个帮助类。 关于作者Grant Skinner是gskinner.com公司CEO及架构师,该公司是一个Flash开 发和咨询公司。他与新媒体机构以及有进取心的客户配合开发前沿利用、游戏和多媒体过程。他擅于将扶持接口设计的代码、可用性、市场和业务逻辑融汇,由此带 给他国际上赞誉并获得包括Best Canadian Developer at FITC 2005在内的多个业界大奖。Grant在gskinner.com/blog/写blog并在incomplet.org揭示他的检讨性的创作。并且,代码审查对肃清一些尤其细节的讹谬大有裨益,
爽利收获- 学习笔记.
2011年07月19日
原文Understanding garbage collection inFlashPlayer 9 翻译 现在我临时在琢磨ActionScript3.0,它的力气让我很兴奋。它的原生厉行速度带来众多可能(此句原文The raw execution speed by itimmolation provides so many possibilities. raw初衷未加工,原始的,这里的含义是点拨入AVM2尔后,ActionScript3.0在厉行速度上有了很大长进,因而使扶持更混杂的组件成为可能,译者注)。它引入了E4X、sockets、byte 数组对象、新的揭示列表模型、正则表白式、正式化的事件和讹谬模型以及其它个性,它是一个令人炫目标大杂烩。 宏伟的力气意味着宏伟的义务,这对ActionScript3.0来说一点没错。引入这些新控件带来一个副作用:草芥采集器不再扶持积极为你采集草芥等假想。也即便说Flash开发者转到ActionScript3.0尔后必需对关于草芥采集如何工作以及如何编程使其工作更加管用具有较深入的会意。未曾这方面的知识,即便创立一个看起来很容易的游戏或利用过程也会揭示SWF文件内存败露、耗光所有系统资源(CPU/内存)导致系统挂起甚至机抬举启。 要点会如何优化你的ActionScript3.0代码,你率先要点会草芥采集器如何在FlashPlayer 9中工作。Flash有两种措施来查找非行动对象并移除它们。本文解释这两种技巧并描写它们如何波及你的代码。 本文结尾你会找到一个运行在FlashPlayer9中的草芥采集器模仿过程,它生动演示了这里解释过的观念。 关于草芥采集器草芥采集器是一个后台历程它负责回收过程中不再利用的对象挪借的内存。非行动对象即便不再有任何等他行动对象引用 它。为便于会意这个观念,有一点极其重要,即便要意识到除非非原生种类(Boolean, String, Number, uint, int例外),你总是穿越一个句柄拜会对象,而非对象本身。当你剔除一个变量其实即便剔除一个引用,而非对象本身。 以下代码很轻率解释这一点: ActionScript代码 // create a new object, and put a reference to it in a: var a:Object = {foo:"bar"} // copy the reference to the object into b: var b:Object = a; // delete the reference to the object in a: delete(a); // check to see that the object is still referenced by b: trace(b.foo); // traces "bar", so the object still exists.
万一我改换上述示例代码将b也剔除,它会使我创立的对象不再有行动引用并期待对草芥采集器回收。ActionScript3.0 草芥回收器利用两种措施定位无引用的对象 : 引用计数法和标识打扫法。 引用计数法引用计数法是一种用于追寻行动对象的较为容易的措施,它从ActionScript1.0开始利用。当你创立一个指向某个对象的引用,该对象的引用计数器加1;当你剔除该对象的一个引用,该计数器减1。当某对象的计数器变成0,该对象将被符号以便草芥回收器回收。 这是一个例子: ActionScript代码
引 用计数法容易,它不会非CPU带来宏伟的担负;多数情形下它工作正常。不幸地是,批准引用计数法的草芥回收器在遭到循环引用时效率不高。循环引用是指对象 穿插引用(直接、或穿越其他对象间接告终)的情形。即方便用过程不再引用该对象,它的引用计数器依旧大于0,因而草芥采集器永远无法采集它们。下面的代码 演示循环引用是怎么回事: ActionScript代码
上 述代码中,所有利用过程中行动的引用都被剔除。我未曾任何措施在过程中再拜会这两个对象了,但这两个对象的引用计数器都是1,因为它们互相引用。循环引用 还能够更加负责 (a 引用 c, c引用b, b引用a, 等等) 并且难于用代码处理。FlashPlayer 6 和 7的XML对象有许多循环引用问题: 每个 XML 节点被它的孩子和父亲引用,因而它们从不被回收。走运的是FlashPlayer 8 添置了一个叫做标识-打扫的新草芥回收技巧。标识-打扫法ActionScript3.0 (以及FlashPlayer 8) 草芥回收器批准第2种计策标识-打扫法查找非行动对象。FlashPlayer从你的利用过程根对象开始(ActionScript3.0中简称为root)直到过程中的每一个引用,都为引用的对象做符号。 接下来,FlashPlayer遍历所有符号过的对象。它将按照该个性递归全副对象树。并将从一个行动对象开始能到达的一切都符号。该过程告终后,FlashPlayer能够平安的假想:所有内存中未曾被符号的对象不再有任何行动引用,因而能够被平安的剔除。图1 演示了它如何工作:绿色引用(箭头)曾被FlashPlayer 符号过程中穿越,绿色对象被符号过,白色对象将被回收。 Figure 1.FlashPlayer批准符号打扫措施符号不再有行动引用的对象 符号-打扫法极其准确。然而,由于FlashPlayer 遍历你的全副对象构造,该过程对CPU挪借太多。FlashPlayer 9 穿越调剂迭代标识-打扫收缩对CPU的挪借。该过程横亘几个阶段不再是顺次告终,变成偶尔运行。 缓期(厉行)草芥回收器和不确定性FlashPlayer 9草芥回收器垄断是缓期的。这是一个要点会的极其重要的观念:当你的对象的所有引用剔除后,它不会被即刻剔除。而是,它们将在未来一个不确定的时刻被 剔除(从开发者的角度来看)。草芥采集器批准一系列启迪式技巧诸如察看RAM分配和内存栈空间大小以及其他措施来定夺何时运行。作为开发者,你定然接受这 样的事实:不可能懂得非行动对象何时被回收。你还定然懂得非行动对象将继续存在直到草芥采集器回收它们。因而你的代码会继续运行(enterFrame 事件会继续)、声音会继续播送、装载还会发生、其它事件还会引发等等。 记住,在FlashPlayer中你无权扼制何时运行草芥采集器去回收对象。作为开发者,你必需尽可能把你的游戏或利用过程中无用的对象利用打扫。管教无用对象的计策将会在我的另一篇文章关键推荐:FlashPlayer 9的资源管教计策。 下图模仿草芥回收器中总内存(包括行动对象和非行动对象的和,译者注)的锯齿状局部(点击图2或下方链接)。锯齿 的发生是由于草芥回收器厉行回收(原文厉行 打扫,疑为厉行回收)。点击该图并当心,按下空格键来间断或重启,并在运行时按住up/down键头以扼制内存利用倾向。 http://om/devnet/flashplayer/articles/garbage_coll ection.html#Figure 2.Garbage collection simulation Garbage collection simulation正如下面演示的一样(单击图3或下方链接),拖动对象(圆角矩形)到桌面并发生它们之间的引用(利用连线,译者注)。点击run reference或mark and sweep按钮以察看哪些对象会被回收。对象上有标识到该对象的引用个数。 http://om/devnet/flashplayer/articles/garbage_coll ection.html#Figure 3.Garbage collection simulation: mark and sweep Garbage collection simulation: mark and sweep从这里通往何方?会意草芥回收机制是编写优化代码的重要前提。优化的代码保证你的Flash项目在客户机器上运行时不会带来大的冲击。阅读更多相干文章,FlashPlayer 9中的资源管教计策,或拜会Flash开发者中心以及FlashPlayer开发者中心。 也能够察看我的blog gskinner.com 阅读关于弱引用的文章并下载我写的一个帮助类。 关于作者Grant Skinner是gskinner.com公司CEO及架构师,该公司是一个Flash开 发和咨询公司。他与新媒体机构以及有进取心的客户配合开发前沿利用、游戏和多媒体过程。他擅于将扶持接口设计的代码、可用性、市场和业务逻辑融汇,由此带 给他国际上赞誉并获得包括Best Canadian Developer at FITC 2005在内的多个业界大奖。Grant在gskinner.com/blog/写blog并在incomplet.org揭示他的检讨性的创作。并且,代码审查对肃清一些尤其细节的讹谬大有裨益,
爽利收获- 学习笔记.