`
zerozone
  • 浏览: 205806 次
  • 来自: 北京
社区版块
存档分类
最新评论

翻译:理解Flash Player 9垃圾回收机制,欢迎指正

阅读更多

原文

Understanding garbage collection in Flash Player 9

翻译

目前我暂时在研究ActionScript 3.0,它的能力让我很激动。它的原生执行速度带来诸多可能(此句原文The raw execution speed by itself provides so many possibilities. raw本意未加工,原始的,这里的意思是指引入AVM2之后,ActionScript 3.0在执行速度上有了很大提高,所以使支持更复杂的组件成为可能,译者注)。它引入了E4X、sockets、byte 数组对象、新的显示列表模型、正则表达式、正式化的事件和错误模型以及其它特性,它是一个令人炫目的大杂烩。

巨大的能力意味着巨大的责任,这对ActionScript 3.0来说一点没错。引入这些新控件带来一个副作用:垃圾收集器不再支持自动为你收集垃圾等假设。也就是说Flash开发者转到ActionScript 3.0之后需要对关于垃圾收集如何工作以及如何编程使其工作更加有效具备较深入的理解。没有这方面的知识,即使创建一个看起来很简单的游戏或应用程序也会出现SWF文件内存泄露、耗光所有系统资源(CPU/内存)导致系统挂起甚至机器重启。

要理解如何优化你的ActionScript 3.0代码,你首先要理解垃圾收集器如何在Flash Player 9中工作。Flash有两种方法来查找非活动对象并移除它们。本文解释这两种技术并描述它们如何影响你的代码。

本文结尾你会找到一个运行在Flash Player9中的垃圾收集器模拟程序,它生动演示了这里解释过的概念。

关于垃圾收集器

垃圾收集器是一个后台进程它负责回收程序中不再使用的对象占用的内存。非活动对象就是不再有任何其他活动对象引用它。为便于理解这个概念,有一点非常重要,就是要意识到除了非原生类型(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也删除,它会使我创建的对象不再有活动引用并等待对垃圾收集器回收。ActionScript 3.0 垃圾回收器使用两种方法定位无引用的对象 : 引用计数法和标识清除法。

引用计数法

引用计数法是一种用于跟踪活动对象的较为简单的方法,它从 ActionScript 1.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, 等等) 并且难于用代码处理。Flash Player 6 和 7的XML对象有很多循环引用问题: 每个 XML 节点被它的孩子和父亲引用,因此它们从不被回收。幸运的是Flash Player 8 增加了一个叫做标识-清除的新垃圾回收技术。

标识-清除法

ActionScript 3.0 (以及 Flash Player 8) 垃圾回收器采用第2种策略标识-清除法查找非活动对象。Flash Player从你的应用程序根对象开始(ActionScript 3.0中简称为root)直到程序中的每一个引用,都为引用的对象做标记。

接下来,Flash Player遍历所有标记过的对象。它将按照该特性递归整个对象树。并将从一个活动对象开始能到达的一切都标记。该过程结束后,Flash Player可以安全的假设:所有内存中没有被标记的对象不再有任何活动引用,因此可以被安全的删除。图1 演示了它如何工作:绿色引用(箭头)曾被 Flash Player 标记过程中经过,绿色对象被标记过,白色对象将被回收。

fig01

Figure 1. Flash Player采用标记清除方法标记不再有活动引用的对象

标记-清除法非常准确。但是,由于 Flash Player 遍历你的整个对象结构,该过程对CPU占用太多。Flash Player 9 通过调整迭代标识-清除缩减对CPU的占用。该过程跨越几个阶段不再是一次完成,变成偶尔运行。

延期(执行)垃圾回收器和不确定性

Flash Player 9垃圾回收器操作是延期的。这是一个要理解的非常重要的概念:当你的对象的所有引用删除后,它不会被立即删除。而是,它们将在未来一个不确定的时刻被 删除(从开发者的角度来看)。垃圾收集器采用一系列启发式技巧诸如查看RAM分配和内存栈空间大小以及其他方法来决定何时运行。作为开发者,你必须接受这样的事实:不可能知道非活动对象何时被回收。你还必须知道非活动对象将继续存在直到垃圾收集器回收它们。所以你的代码会继续运行(enterFrame 事件会继续)、声音会继续播放、装载还会发生、其它事件还会触发等等。

记住,在Flash Player中你无权控制何时运行垃圾收集器去回收对象。作为开发者,你需要尽可能把你的游戏或应用程序中无用的对象应用清除。管理无用对象的策略将会在我的另一篇文章重点介绍:Flash Player 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项目在客户机器上运行时不会带来大的冲击。阅读更多相关文章,Flash Player 9中的资源管理策略,或访问Flash开发者中心以及Flash Player开发者中心。

也可以查看我的blog gskinner.com 阅读关于弱引用的文章并下载我写的一个辅助类。

关于作者

Grant Skinner是gskinner.com公司CEO及架构师,该公司是一个Flash开发和咨询公司。他与新媒体机构以及有进取心的客户合作开发前沿应用、游戏和多媒体程序。他擅于将支持接口设计的代码、可用性、市场和业务逻辑融汇,由此带给他国际上赞誉并获得包括Best Canadian Developer at FITC 2005在内的多个业界大奖。Grant在gskinner.com/blog/写blog并在incomplet.org展示他的验证性的创作。
  • 大小: 15.2 KB
  • 大小: 8.6 KB
分享到:
评论
4 楼 kjj 2007-06-17  
连写个flash都要考虑垃圾回收,汗!
3 楼 hax 2007-06-16  
可以参考java的垃圾回收。虽然垃圾回收早在lisp就有了,但是java确实大有发展。它使得java的整体性能超过了c和c++。
2 楼 fkpwolf 2007-06-16  
UI也要关心GC?要命
1 楼 eboge 2007-05-23  
FLASH PLAYER 9里面支持action script3 吗?  我记得好像FLASH 8里面带的PLAYER9,但是里面ACTION SCRIPT是2哦

相关推荐

    flashplayer9 debug

    标题“FlashPlayer9 Debug”指的是Adobe Flash Player的调试版本,专为开发人员设计,以便在FlashDevelop这样的集成开发环境中(IDE)对ActionScript代码进行测试和调试。FlashPlayer9是这款广泛使用的网络浏览器...

    FlashPlayer9 官方独立播放器

    FlashPlayer9 官方独立播放器 版本:9.0.124.0

    Flash Player 卸载工具 Adobe Flash Player Uninstaller 34.0.0.92.rar

    Adobe Flash Player是一款曾经广泛应用于网页浏览器的多媒体播放器,它支持播放动画、视频、音频以及交互式内容。然而,随着技术的发展,特别是HTML5的普及,Flash Player的重要性逐渐下降,且由于安全问题,Adobe...

    Adobe Flash Player for IE v11.3.300.265

    Adobe Flash Player(Flash Player官方下载)是一个集成的多媒体播放器,让你在Web上享受更广泛的多媒体体验。Adobe Flash Player官方版可显示和播放多媒体内容,从数以千计的高度交互性的flash player下载,到有音频...

    MP3转换为Flash音乐播放器:Aleo Flash MP3 Player Builder绿色版

    "MP3转换为Flash音乐播放器:Aleo Flash MP3 Player Builder绿色版"是一个专注于将MP3和其他音频格式转换为Flash(SWF)播放器的工具。这款软件提供了便捷的方式,使得用户能够批量处理音频文件,将其转化为适合网页...

    sa_flashplayer_9_debug

    1. **调试功能**:Flash Player调试版提供了一种跟踪和识别问题的方法,包括错误消息、警告和详细的堆栈跟踪,这对于定位代码错误非常有帮助。 2. **SWF文件解析**:Flash Player能够解析和执行SWF文件中的...

    flashplayer V10.1.85

    **FlashPlayer V10.1.85:深入解析与应用** FlashPlayer V10.1.85 是一个重要的软件版本,它属于Adobe Flash Player系列,是互联网上广泛使用的多媒体内容播放器。这款软件的核心功能是播放含有Flash技术的交互式...

    Arm64 Flashplayer Linux UOS 鲲鹏 飞腾

    标题中的"Arm64 Flashplayer Linux UOS 鲲鹏 飞腾"涉及的是在基于Arm64架构的Linux操作系统UOS(统一操作系统)上运行Flash Player的场景,特别提到了鲲鹏和飞腾这两种国产处理器平台。下面将详细阐述相关知识点: ...

    FlashPlayer_flashplayer_

    - **ActiveX** 支持:FlashPlayer的运行通常依赖于ActiveX控件,Delphi 7提供了对ActiveX的全面支持,允许开发者在Delphi应用中无缝集成ActiveX控件。 此外,开发者还需要关注安全性问题,因为FlashPlayer在后期...

    64位浏览器的flash插件下载(flashplayer for 64-bit browser)

    3. **更新**:Flash Player经常需要更新以修复安全漏洞,因此安装后应定期检查更新。 4. **设置**:浏览器可能需要被配置以允许运行Flash内容,这通常可以在浏览器的扩展或插件设置中找到。 5. **替代方案**:由于...

    swf文件播放器Adobe Flash Player珍藏版Adobe Flash Player中文电脑版v10.3.181.22

    Adobe Flash Player中文电脑版是一款一种广泛使用的、专有的多媒体程序播放器。它最初由Macromedia编写,在Macromedia被Adobe收购后由Adobe继续开发并分发。Adobe Flash Player最初设计目的为播放2维向量动画,但...

    FlashPlayer.rar

    1. **多媒体播放**:Flash Player支持播放SWF格式的动画和交互式内容,这些内容可能包含2D图形、音频、视频和复杂的互动元素。它可以处理矢量图形,这意味着内容在任何分辨率下都能保持清晰。 2. **ActionScript 3...

    flashplayer_11_ax_debug最新版

    Flash Player是一款广泛应用于网页端的多媒体播放器,尤其在展示互动式内容如游戏、动画以及应用程序方面具有重要作用。Adobe Flash Player 11 AX Debug是最新的调试版本,它为开发人员和学习FLEX、ActionScript(AS...

    FlashPlayer11版本地播放器-精简版

    首先,我们要理解FlashPlayer11的核心功能。它支持ActionScript3.0,这意味着它可以运行更复杂的交互式应用程序,包括游戏、动态图形以及网络视频。此外,FlashPlayer11还提升了对高清视频的支持,提供流畅的视频...

    flashplayer_10_sa SWF动画播放工具 本地播放

    5. **浏览器插件**:Flash Player最初作为浏览器插件使用,适用于多种浏览器,如Internet Explorer、Firefox、Chrome等。 6. **版本更新**:Flash Player经历了多次版本迭代,每个新版本通常修复了旧版的漏洞并增加...

    flashplayer32_0r0_371_linuxpep.x86_64.tar.gz

    综合这些信息,我们可以理解这是一个专为Linux和Chrome浏览器设计的Adobe Flash Player最后版本,用户可以按照readme.txt的指示进行安装和使用。由于Adobe已停止对Flash的支持,用户需要注意安全风险,并尽快迁移到...

    QT开发flashplayer播放器

    3. **事件处理和交互性**:由于Flash Player播放器与Flash媒体文件可以实现交互,因此需要理解QT的信号和槽机制,这是QT中实现对象间通信的重要方式。当用户与Flash内容交互时,如点击按钮或触发某些动作,这些事件...

    flashplayer debug 版

    Flash Player Debug版是一款专为开发人员设计的特殊版本,它允许开发者在运行含有ActionScript代码的Flash内容时进行调试。ActionScript是Adobe Flash环境中用于创建交互式内容、动画和应用程序的主要编程语言。与...

    怎样在Ubuntu Linux上安装最新的FlashPlayer 10

    Ubuntu Linux 上安装最新的 FlashPlayer 10.2 beta FlashPlayer 是一个非常流行的浏览器插件,用于播放 flash 视频和游戏。 Adobe 公司最近发布了最新的 FlashPlayer 10.2 beta 版本,这个版本带来了阶段性视频硬件...

    Macromedia Flash Player 8.0 r22

    很多的朋友反映,将喜欢的Flash动画下载到自己的电脑后总是用IE浏览器或者第三方Flash播放器才能观看,感觉不好,希望用Macromedia的Flash Player播放,可是又很难找到!现在我就发一个最新版本的给大家!不过请注意...

Global site tag (gtag.js) - Google Analytics