- 浏览: 501683 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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实战)
先了解下回收的原理,如果觉得麻烦,可以直接看最后的方法
摘自:http://www.duzengqiang.com/blog/article.asp?id=245
AS3垃圾收集器不再支持自动为你收集垃圾等假设。也就是说Flash开发者转到ActionScript
3.0之后需要对关于垃圾收集如何工作以及如何编程使其工作更加有效具备较深入的理解。没有这方面的知识,即使创建一个看起来很简单的游戏或应用程序也会
出现SWF文件内存泄露、耗光所有系统资源(CPU/内存)导致系统挂起甚至机器重启。
要理解如何优化你的ActionScript 3.0代码,你首先要理解垃圾收集器如何在Flash Player 9中工作。Flash有两种方法来查找非活动对象并移除它们。本文解释这两种技术并描述它们如何影响你的代码。
本文结尾你会找到一个运行在Flash Player9中的垃圾收集器模拟程序,它生动演示了这里解释过的概念。
关于垃圾收集器
垃圾收集器是一个后台进程它负责回收程序中不再使用的对象占用的内存。非活动对象就是不再有任何其他活动对象引用它。为便于理解这个概念,有一点非常重
要,就是要意识到除了非原生类型(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也删除,它会使我创建的对象不再有活动引用并等待对垃圾收集器回收。ActionScript 3.0 垃圾回收器使用两种方法定位无引用的对象 : 引用计数法和标识清除法。
引用计数法
引用计数法是一种用于跟踪活动对象的较为简单的方法,它从 ActionScript 1.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, 等等) 并且难于用代码处理。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 标记过程中经过,绿色对象被标记过,白色对象将被回收。
Figure 1. Flash Player采用标记清除方法标记不再有活动引用的对象
标记-清除法非常准确。但是,由于 Flash Player 遍历你的整个对象结构,该过程对CPU占用太多。Flash Player 9 通过调整迭代标识-清除缩减对CPU的占用。该过程跨越几个阶段不再是一次完成,变成偶尔运行。
延期(执行)垃圾回收器和不确定性
Flash Player
9垃圾回收器操作是延期的。这是一个要理解的非常重要的概念:当你的对象的所有引用删除后,它不会被立即删除。而是,它们将在未来一个不确定的时刻被
删除(从开发者的角度来看)。垃圾收集器采用一系列启发式技巧诸如查看RAM分配和内存栈空间大小以及其他方法来决定何时运行。作为开发者,你必须接受这
样的事实:不可能知道非活动对象何时被回收。你还必须知道非活动对象将继续存在直到垃圾收集器回收它们。所以你的代码会继续运行(enterFrame
事件会继续)、声音会继续播放、装载还会发生、其它事件还会触发等等。
下面介绍回收的有效方法:
由这副图可以看出来
当你的类中包含的对象越多,嵌套越深,对象越复杂,系统回收发费时间就越长。而我们如果自行把这些对象与嵌套拆开来,使得每个复杂的对象变成一个一个的非常小的对象,那么回收所花的时间就会大大减少了。所以我们写完类,记得给类加上一个垃圾回收器,如:
package buildworld
{
import flash.display.Sprite;
import mypkg.MapBlock;
public class Map extends Sprite
{
private var map:Array = new Array();
private var mapName:String = "map1";
public function Map(nw:int,nh:int):void
{
this.createMap();
}
public function createMap():void
{
for(var h = 0;h < this.nHeight;h++)
{
this.map[h] = new Array();
for(var l = 0;l < this.nWidth;l++)
{
//MapBlock是个类,
this.map[h][l] = new MapBlock();
}
}
}
//垃圾回收器
public function gc():void
{
for(var h = 0;h < this.nHeight;h++)
{
for(var l = 0;l < this.nWidth;l++)
{
this.removeChild(this.map[h][l]);
this.map[h][l].gc();//调用MapBlock中的垃圾回收器
this.map[h][l] = null;
}
}
mapName = null;
}
}
}
那么最终进行垃圾回收就方便多了。
不知道大家还有更好的方法没?
发表评论
-
十个Flex/Air疑难杂症及解决方案简略
2010-05-31 17:17 3309最近去一家台企面 ... -
Windows环境下配置+运行red5源码+AS3连接red5简单示例
2010-04-19 13:39 5155Windows环境下配置+运行red5源码+AS3连接red5 ... -
使用aperture框架让AS3与C++通信,执行本地代码
2010-04-08 16:48 3201我们都知道,AIR的效果是非常出色的,这也是大家喜欢她的原因, ... -
SQLITE入门至精通
2010-04-07 11:13 2970关键 ... -
教你解析FLEX JSON中的一个问题 关于键值 和键
2010-04-01 15:25 2275字符串:message = ' "param&quo ... -
air写文件保存在安装目录
2010-03-31 15:46 3182AIR中..保存文件我们般会像下面这样操作 var f ... -
弱弱的一个小问题,bitmapdata pngencoder base64 bytearray
2010-03-31 14:16 1122好久没写东东了,呵呵。随便写点点。关于bitmapdata如何 ... -
FLASH教程:SWF间的双向通信
2010-03-02 18:23 1324假设有一个主 SWf 名为 m ... -
如何把as文件生成swf格式文件
2010-03-02 18:22 5207一,从http://opensource.adobe.com/ ... -
Flex数据交互方法 :httpservice, webservice, RemoteObject, socket
2010-02-27 17:06 1885【转载】 文章分类:Flash编程 http://h ... -
理解Flash Player 9垃圾回收机制
2010-02-02 18:27 1048理解Flash Player 9垃圾回 ... -
BlazeDS入门教程-很详细-赞原创作者一个
2010-01-11 23:51 1684什么是BlazeDS呢?BlazeDS是一个基于服务器的Ja ... -
一些漂亮的Flex主题下载
2010-01-11 10:31 6124一些漂亮的Flex主题下载1Digg meWindows Cl ... -
通过Stratus 服务器在Flash Player中使用RTMFP 开发 点对点应用(一)
2010-01-08 17:43 5363作者:Jozsef Vass 译者:巴巴鲁 ... -
ActionScript 3.0著名开源库 大集合
2009-12-29 17:26 1997这篇文章开始于对Adrian ... -
Flex 读取XML配置文件总结
2009-11-19 11:45 1949在Flex中我 ... -
一个list定义组件,网上找了很久没有,自己做了一个。
2009-10-29 11:55 1199一个list定义组件,网上找了很久没有,自己做了一个。希望对大 ... -
如何使用Flex RemoteObject components 与JAVA交互
2009-10-08 18:04 52442008-12-25 | 22:53分类:前端开发 ... -
flex 在线录制视频语音
2009-09-12 17:45 3568<?xml version="1.0" ... -
flex 蒙板 遮罩
2009-09-11 17:09 3847方法一 <mx:Image source=&q ...
相关推荐
VC 内存操作:内存回收及分配空间的实例代码,根据运行后所返回的信息,可看出程序再分配内存后,又重新收回了内存,从分配到释放的一个过程,先处理剩余空间然后修改原来的节点信息,把剩余的空间化为一个节点并连...
C++高手必过内存管理关,探讨C++内存回收,C++内存泄漏及其检测工具
针对大内存对象引起的内存回收机制分析,单个实例内存配置为20G。
C++内存回收机制,说明继承等C++数据结构如何回收
安卓 内核内存回收机制
深入理解.NET内存回收机制, 虽然只是个word文档,但是值得一看
在.net平台中,垃圾是系统自动回收得到。但我们再开发中,却发现程序随着运行,内存不断增大。本程序可以强制回收系统不用的内存。
c++的内存回收,PDF,希望对大家有帮助
本文从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。
C# 内存回收C# 内存回收C# 内存回收C# 内存回收C# 内存回收
服务器内存占用异常,设置站点应用程序池回收,解决内存高占用问题,解决问题的同方法:IIS服务管理器----》应用程序池----》回收----》专业内存限制(KB),并设置最大内存,当程序达到最大内存后其会自动重启。
Java的内存回收, 及时的回收内存资源,更有利于程序的稳定性
The art of c++中的垃圾回收机制实现,对书中代码的bug进行了修改
简要介绍.NET中内存回收机制 让你大致了解.NET平台的内部工作
JVM内存回收最全的手册书籍,详细介绍了各种内存回收算法,是Java程序员进阶的必备书籍
操作系统内存回收.doc
C内存管理内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍...本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题
设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一: 最先适应算法 最优适应算法 最坏适应算法
HotSpot的垃圾回收机制采用...JVM内存回收只要是针对这3个区域来说的。像NIO的直接文件内存读取,使用的是直接内存,只有出发了FullGC方能回收该区域!JNI调用本地库,本地代码所消耗的内存需要操作系统额外开辟内存。
首次适应算法和最佳适应算法及内存回收,用C语言实现,测试正确。