- 浏览: 500063 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
michao:
大哥,还有aperture.exe吗? 发我一份,找不到呀,m ...
使用aperture框架让AS3与C++通信,执行本地代码 -
Aaron-Joe-William:
文件被删除了。下不了。
SQLite 数据库加密的一种解决方案 -
hanmiao:
樓主的文章不就是來自IBM Developers里的http: ...
mina 入门 -
howesen:
断包与粘包问题,需要处理下就好了
mina接收数据不全(2) -
sniciq:
git clone --recursive git://git ...
ESB学习笔记(Spring Integration实战)
理解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代码
- // 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代码
- var a:Object = {foo:"bar"}
- // the object now has a reference count of 1 (a)
- var b:Object = a;
- // now it has a reference count of 2 (a & b)
- delete(a);
- // back to 1 (b)
- delete(b);
- // the reference count down is now 0
- // the object can now be deallocated by the garbage collector
引 用计数法简单,它不会非CPU带来巨大的负担;多数情况下它工作正常。不幸地是,采用引用计数法的垃圾回收器在遇到循环引用时效率不高。循环引用是指对象 交叉引用(直接、或通过其他对象间接实现)的情况。即使应用程序不再引用该对象,它的引用计数器仍然大于0,因此垃圾收集器永远无法收集它们。下面的代码 演示循环引用是怎么回事: ActionScript代码
- var a:Object = {}
- // create a second object, and reference the first object:
- var b:Object = {foo:a};
- // make the first object reference the second as well:
- a.foo = b;
- // delete both active application references:
- delete(a);
- 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展示他的验证性的创作。
发表评论
-
十个Flex/Air疑难杂症及解决方案简略
2010-05-31 17:17 3295最近去一家台企面 ... -
Windows环境下配置+运行red5源码+AS3连接red5简单示例
2010-04-19 13:39 5146Windows环境下配置+运行red5源码+AS3连接red5 ... -
使用aperture框架让AS3与C++通信,执行本地代码
2010-04-08 16:48 3194我们都知道,AIR的效果是非常出色的,这也是大家喜欢她的原因, ... -
SQLITE入门至精通
2010-04-07 11:13 2961关键 ... -
教你解析FLEX JSON中的一个问题 关于键值 和键
2010-04-01 15:25 2266字符串:message = ' "param&quo ... -
air写文件保存在安装目录
2010-03-31 15:46 3173AIR中..保存文件我们般会像下面这样操作 var f ... -
弱弱的一个小问题,bitmapdata pngencoder base64 bytearray
2010-03-31 14:16 1116好久没写东东了,呵呵。随便写点点。关于bitmapdata如何 ... -
FLASH教程:SWF间的双向通信
2010-03-02 18:23 1315假设有一个主 SWf 名为 m ... -
如何把as文件生成swf格式文件
2010-03-02 18:22 5199一,从http://opensource.adobe.com/ ... -
Flex数据交互方法 :httpservice, webservice, RemoteObject, socket
2010-02-27 17:06 1880【转载】 文章分类:Flash编程 http://h ... -
BlazeDS入门教程-很详细-赞原创作者一个
2010-01-11 23:51 1678什么是BlazeDS呢?BlazeDS是一个基于服务器的Ja ... -
一些漂亮的Flex主题下载
2010-01-11 10:31 6113一些漂亮的Flex主题下载1Digg meWindows Cl ... -
通过Stratus 服务器在Flash Player中使用RTMFP 开发 点对点应用(一)
2010-01-08 17:43 5357作者:Jozsef Vass 译者:巴巴鲁 ... -
ActionScript 3.0著名开源库 大集合
2009-12-29 17:26 1988这篇文章开始于对Adrian ... -
Flex 读取XML配置文件总结
2009-11-19 11:45 1943在Flex中我 ... -
一个list定义组件,网上找了很久没有,自己做了一个。
2009-10-29 11:55 1192一个list定义组件,网上找了很久没有,自己做了一个。希望对大 ... -
如何使用Flex RemoteObject components 与JAVA交互
2009-10-08 18:04 52392008-12-25 | 22:53分类:前端开发 ... -
flex 在线录制视频语音
2009-09-12 17:45 3563<?xml version="1.0" ... -
flex 蒙板 遮罩
2009-09-11 17:09 3838方法一 <mx:Image source=&q ... -
如何自定义FLEX3的loading进度条
2009-09-05 10:17 1712第一种:修改下载进度的文字为中文 建立扩展至 mx.prel ...
相关推荐
flashplayer9 debug可用于flashdevelop平台调试,对于actionscript代码编写有不错的帮助,希望大家喜欢。
FlashPlayer9 官方独立播放器 版本:9.0.124.0
Flash Player离线安装包下载
最新flashplayer离线安装包下载
FlashPlayer11-5安装包FlashPlayer11-5安装包FlashPlayer11-5安装包FlashPlayer11-5安装包
很多的朋友反映,将喜欢的Flash动画下载到自己的电脑后总是用IE浏览器或者第三方Flash播放器才能观看,感觉不好,希望用Macromedia的Flash Player播放,可是又很难找到!现在我就发一个最新版本的给大家!不过请注意...
flashplayer11_b1_install_win_ie32_071311flashplayer11_b1_install_win_ie32_071311flashplayer11_b1_install_win_ie32_071311flashplayer11_b1_install_win_ie32_071311flashplayer11_b1_install_win_ie32_071311...
FlashPlayer created with delphi 7
Adobe Flash Player(Flash Player官方下载)是一个集成的多媒体播放器,让你在Web上享受更广泛的多媒体体验。Adobe Flash Player官方版可显示和播放多媒体内容,从数以千计的高度交互性的flash player下载,到有音频...
Flashplayer9.exe
关于老系统上传文件提示 “you need the flash player 9.028 or above to use swfuploal”的解决方案版本。(信新版本的flash安装后无法解决此问题)
flashplayer V10.1.85,单文件运行
Arm64 Flashplayer Linux UOS 鲲鹏 飞腾
众所周知 adobe flash player 已被苏-州-思-杰-马-克-丁-代-理 在flash临死前打捞一笔 目前最新版本31 会弹出 ff资讯弹窗 Flash Helper Service服务后台常驻 收集用户隐私 如果禁止 flash将不可用 现在我收集了...
最新flashplayer 播放器 浏览器插件
flashplayer_11_plugin_debug
win7 64位Flashplayer 11 Windows 7 64位系统专用。
\flashplayer10\flashplayer10
install_flash_player 离线安装版