`
wangleifire
  • 浏览: 510885 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

理解Flash Player 9垃圾回收机制

    博客分类:
  • FLEX
阅读更多

理解Flash Player 9垃圾回收机制

翻译:理解FlashPlayer 9垃圾回收机制,欢迎指正
原文 Understanding garbage collection inFlashPlayer 9   翻译 目前我暂时在研究ActionScript3.0,它的能力让我很激动。它的原生执行速度带来诸多可能(此句原文The raw execution speed by itself 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代码

  1. // create a new object, and put a reference to it in a:  
  2. var a:Object = {foo:"bar"}  
  3. // copy the reference to the object into b:  
  4. var b:Object = a;  
  5. // delete the reference to the object in a:  
  6. delete(a);  
  7. // check to see that the object is still referenced by b:  
  8. trace(b.foo); // traces "bar", so the object still exists.  


如果我改变上述示例代码将b也删除,它会使我创建的对象不再有活动引用并等待对垃圾收集器回收。ActionScript3.0 垃圾回收器使用两种方法定位无引用的对象 : 引用计数法和标识清除法。  引用计数法  引用计数法是一种用于跟踪活动对象的较为简单的方法,它从ActionScript1.0开始使用。当你创建一个指向某个对象的引用,该对象的引用计数器加1;当你删除该对象的一个引用,该计数器减1。当某对象的计数器变成0,该对象将被标记以便垃圾回收器回收。  这是一个例子:   ActionScript代码

  1. var a:Object = {foo:"bar"}  
  2. // the object now has a reference count of 1 (a)  
  3. var b:Object = a;  
  4. // now it has a reference count of 2 (a & b)  
  5. delete(a);  
  6. // back to 1 (b)  
  7. delete(b);  
  8. // the reference count down is now 0  
  9. // the object can now be deallocated by the garbage collector  


引 用计数法简单,它不会非CPU带来巨大的负担;多数情况下它工作正常。不幸地是,采用引用计数法的垃圾回收器在遇到循环引用时效率不高。循环引用是指对象 交叉引用(直接、或通过其他对象间接实现)的情况。即使应用程序不再引用该对象,它的引用计数器仍然大于0,因此垃圾收集器永远无法收集它们。下面的代码 演示循环引用是怎么回事:   ActionScript代码

  1. var a:Object = {}  
  2. // create a second object, and reference the first object:  
  3. var b:Object = {foo:a};  
  4. // make the first object reference the second as well:  
  5. a.foo = b;  
  6. // delete both active application references:  
  7. delete(a);  
  8. delete(b);  

上 述代码中,所有应用程序中活动的引用都被删除。我没有任何办法在程序中再访问这两个对象了,但这两个对象的引用计数器都是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://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html#  Figure 2.Garbage collection simulation  Garbage collection simulation  正如下面演示的一样(单击图3或下方链接),拖动对象(圆角矩形)到桌面并建立它们之间的引用(使用连线,译者注)。点击run reference或mark and sweep按钮以查看哪些对象会被回收。对象上有标识到该对象的引用个数。  http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.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展示他的验证性的创作。

分享到:
评论

相关推荐

    flash关于内存管理与内存管理

    总结来说,理解Flash Player的内存管理和垃圾回收机制对于开发健壮的Flex应用程序至关重要。通过合理管理对象引用,以及熟悉和应用不同的垃圾回收策略,开发者可以有效地防止内存泄露,提高程序性能。在实际开发中,...

    Flex 应用内存泄露的分析与诊断

    总之,理解 FlashPlayer 的垃圾回收机制和 Flex 中对象引用的管理是防止内存泄露的关键。通过谨慎处理对象引用、正确管理事件监听器和利用调试工具,可以有效地减少 Flex 应用中的内存泄露问题,从而提高应用的性能...

    Flex内存管理及相关内容.pdf

    Flash Player中的垃圾回收机制是由后台运行的垃圾回收器(garbage collector)负责执行的。它的主要任务是释放那些不再被应用程序使用的对象所占用的内存空间。在ActionScript中,除了基本类型(如Boolean、String、...

    Flex内存泄露总结

    Flex内存泄露总结主要聚焦在Flash Player的垃圾回收机制和内存管理问题上,这对于优化Flex应用程序的性能至关重要。首先,我们要理解垃圾回收的基本原理。在Flash Player中,内存的释放工作由垃圾回收器负责,它是一...

    AS3内存优化及垃圾回收.pdf

    AS3,全称为ActionScript 3...综上所述,理解AS3的内存优化和垃圾回收机制是提高应用程序性能的关键。合理选择显示对象,优化数据类型使用,避免过度使用滤镜,以及正确管理对象引用,都是实现高效内存管理的有效手段。

    Flash,Flex和AIR应用开发内存监测及优化技巧

    Flash Player的垃圾回收机制不是始终运行的,它仅在内存分配过程中触发。垃圾回收器在标记清除闲置对象时采用增量扫描技术。开发者应使用弱引用(weak reference)来避免循环引用和内存泄漏。例如,在添加事件监听器...

    AS3内存优化及垃圾回收参照.pdf

    在编写AS3代码时,理解这些内存优化技巧和垃圾回收机制是非常重要的,可以显著提升应用的性能和效率。合理使用对象,避免不必要的内存占用,以及正确管理资源的生命周期,都是AS3开发者需要掌握的基本技能。

    DescriptionPaneAS3_flash源码_

    9. **性能优化**:理解Flash Player的内存管理和垃圾回收,以及如何避免性能瓶颈。 10. **组件开发**:源码中可能包含自定义组件的实现,这有助于我们了解如何创建可重用的UI元素。 通过深入研究这份AS3的Flash ...

    flash内部机制

    4. **垃圾回收 (GC)**:自动管理内存,减少程序员的负担。 ### 小结 Flash Player作为一款历史悠久且广泛应用的技术,在其背后隐藏着复杂的内部机制。从核心周期到用户代码处理器,再到AVM2的具体实现,每个环节都...

    flash播放器(源码)

    它具有强大的类型系统、垃圾回收机制和丰富的类库,适用于开发桌面应用、Web应用以及游戏等。 2. **Windows Presentation Foundation (WPF)**:C#中的WPF是微软提供的一个用于构建Windows桌面应用程序的框架,它...

    Flex 编程注意之性能优化、垃圾回收的一些总结

    然而,尽管遵循以上规则,由于Flash Player的自动垃圾回收机制,有时内存仍可能持续较高。这时,可以采用非标准的强制垃圾回收策略,即通过故意引发错误并捕获它来触发垃圾回收: ```actionscript package util { ...

    Flex内存管理及相关内容

    Flash Player中的垃圾回收机制是由一个名为垃圾回收器(Garbage Collector, GC)的后台进程负责执行的。该进程的主要任务是释放不再被应用程序使用的对象所占用的内存空间。在AS中,非基本类型(如Object、Array等)...

    C#版FlashPlayer动画播放器

    C#语言以其强大的类型系统、面向对象特性、垃圾回收机制以及.NET框架的支持而受到青睐。在这个FlashPlayer播放器中,开发者可能使用了C#类库来处理多媒体数据,如System.Media类,用于播放声音,或者更复杂的库如...

    Flash8和C#的整合交互

    C#具有强大的类型系统、垃圾回收机制以及丰富的类库,适合构建复杂的桌面应用和游戏。 4. 整合交互:Flash8和C#的整合主要是通过Adobe Flash Player的ExternalInterface API来实现的。这个API允许Flash内容与宿主...

    flash播放器

    1. **C#基础**:C#是一种现代的、类型安全的、面向对象的编程语言,具有垃圾回收机制、强类型检查和异常处理等功能。初学者需要了解C#的基本语法,包括变量、数据类型、运算符、流程控制语句等。 2. **Windows ...

    flashas3 api使用手册

    AS3相较于之前的版本,进行了大量的语法改进和性能提升,包括类的完全支持、强类型系统和垃圾回收机制。AS3中的所有数据都是对象,这使得它更接近于传统的面向对象编程语言。基础知识点包括变量声明(var关键字)、...

    学习_Adobe_Flash_中的_ActionScript_2[1].0.pdf

    - **性能优化**:通过更高效的垃圾回收和编译器优化,提高了运行时性能。 - **增强的调试工具**:提供了更详细的错误报告和调试信息,便于开发者查找和修复问题。 - **新的APIs**:增加了对XML、网络请求、声音处理...

    Flash Builder 4.6 中文帮助文档

    - **垃圾回收**:涉及垃圾回收机制,帮助理解内存管理。 - **问题区域识别**:指导如何识别性能瓶颈。 - **概要分析器过滤器**:利用过滤器来细化分析结果。 #### 第7章:Flash Builder 中的 Unit 测试工具 **单元...

Global site tag (gtag.js) - Google Analytics