我理解的AS3的内存泄露与垃圾回收
2012-06-11 20:23
316 查看
http://www.cnblogs.com/cos2004/archive/2010/11/07/1870980.html
一、内存泄漏
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费(百度搜的资料)。这段话是什么意思呢?打个比方吧,放牛人与一只牛,放牛人好比程序设计中的引用,牛好比对象。我们通过引用来控制对象,放牛人通过绳子牵着牛,当牛吃完草后应该牵它回家而不是放手让它走失。当我们失去对该对象(某块内存)的控制时就产生了“内存泄露”。
二、垃圾回收
简单点说不用的内存都是垃圾,而垃圾回收就是把没用的内存都回收以释放内存空间。
AS3的垃圾回收主要有两种方法:“引用计数法”和“标识清除法”。
引用计数法:当一个内存对象添加了一个引用的时候,这个计数器就加1,当删除一个内存对象的引用时,该计数器就减1。当FP判断计数器为0的时候表示这个对象已经没有引用了,没有引用就没办法控制他了,符合垃圾回收机制的条件。但有一种情况则会有所不同!当有多个对象互相引用的时候,所有的计数器始终为1,这时就出现了内存泄露的情况。举个例子:
var a:Object = {}
var b:Object = {foo:a};
a.foo = b;
a=null;
b=null;
上述代码中,所有对象的引用都被删除了。没有任何办法在程序中再访问这两个对象了,但这两个对象的引用计数器都是1,因为它们相互引用。 即该两个内存块确实是没用了,但是垃圾回收机却不清理它。可想而知,这个办法在一般情况下还是不错的,但是遇到这种情况就不行了!于是要考虑第二种
方法了。
标识清除法: 这个方法在执行的时候会从FLASH的根对象也就是root开始到每一个引用的对象做标识。然后FLASH会遍历当前程序中的所有引用,发现没有标识的对象就清除。这样的话清除就准确了!但是会遇到一个问题。遍历是很消耗CPU的,虽然fp9通过调整迭代标识清除缩减对CPU的占用,但是消耗依然很大!所以采用了另外一种比较消极的处理方法!就是分段执行,每次执行一部分,然后偶尔执行一次。这样来减小CPU的消耗。所以我们通常知道,FP9、10的垃圾回收机是偶尔执行的!
三、垃圾回收的函数方法
System.disposeXML()
BitmapData.dispose()
Loader.unloadAndStop()
System.gc() ,这是一个最有用的函数,却只适用于调试版的FP
removeChild()
removeEventListener()
设置引用为null
System.totalMemory,返回值是内存占用字节数,这个跟内存回收没什么关系,只是用来查看内存占用,调试常用到
……
以上函数都是垃圾回收会用到的方法,不过一般需要按具体情况具体去确定综合运用几个方法。这个需要你真正理解FP的内存回收机制才会懂得如何运用。
一、内存泄漏
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费(百度搜的资料)。这段话是什么意思呢?打个比方吧,放牛人与一只牛,放牛人好比程序设计中的引用,牛好比对象。我们通过引用来控制对象,放牛人通过绳子牵着牛,当牛吃完草后应该牵它回家而不是放手让它走失。当我们失去对该对象(某块内存)的控制时就产生了“内存泄露”。
二、垃圾回收
简单点说不用的内存都是垃圾,而垃圾回收就是把没用的内存都回收以释放内存空间。
AS3的垃圾回收主要有两种方法:“引用计数法”和“标识清除法”。
引用计数法:当一个内存对象添加了一个引用的时候,这个计数器就加1,当删除一个内存对象的引用时,该计数器就减1。当FP判断计数器为0的时候表示这个对象已经没有引用了,没有引用就没办法控制他了,符合垃圾回收机制的条件。但有一种情况则会有所不同!当有多个对象互相引用的时候,所有的计数器始终为1,这时就出现了内存泄露的情况。举个例子:
var a:Object = {}
var b:Object = {foo:a};
a.foo = b;
a=null;
b=null;
上述代码中,所有对象的引用都被删除了。没有任何办法在程序中再访问这两个对象了,但这两个对象的引用计数器都是1,因为它们相互引用。 即该两个内存块确实是没用了,但是垃圾回收机却不清理它。可想而知,这个办法在一般情况下还是不错的,但是遇到这种情况就不行了!于是要考虑第二种
方法了。
标识清除法: 这个方法在执行的时候会从FLASH的根对象也就是root开始到每一个引用的对象做标识。然后FLASH会遍历当前程序中的所有引用,发现没有标识的对象就清除。这样的话清除就准确了!但是会遇到一个问题。遍历是很消耗CPU的,虽然fp9通过调整迭代标识清除缩减对CPU的占用,但是消耗依然很大!所以采用了另外一种比较消极的处理方法!就是分段执行,每次执行一部分,然后偶尔执行一次。这样来减小CPU的消耗。所以我们通常知道,FP9、10的垃圾回收机是偶尔执行的!
三、垃圾回收的函数方法
System.disposeXML()
BitmapData.dispose()
Loader.unloadAndStop()
System.gc() ,这是一个最有用的函数,却只适用于调试版的FP
removeChild()
removeEventListener()
设置引用为null
System.totalMemory,返回值是内存占用字节数,这个跟内存回收没什么关系,只是用来查看内存占用,调试常用到
……
以上函数都是垃圾回收会用到的方法,不过一般需要按具体情况具体去确定综合运用几个方法。这个需要你真正理解FP的内存回收机制才会懂得如何运用。
相关文章推荐
- 我理解的AS3的内存泄露与垃圾回收
- 【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出
- 对android虚拟机的理解,包括内存管理机制,垃圾回收机制
- JavaScript 的垃圾回收与内存泄露
- 简析Android的垃圾回收与内存泄露
- Java中内存泄露及垃圾回收机制
- 【转载】Java垃圾回收内存清理相关(虚拟机书第三章),GC日志的理解,CPU时间、墙钟时间的介绍
- 对android虚拟机的理解,包括内存管理机制垃圾回收机制。dalvik和art区别
- Java垃圾回收机制以及内存泄露
- JAVA垃圾回收机制与内存泄露
- [置顶] 深入理解JVM之二:内存的垃圾回收算法
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
- JAVA 内存管理总结:内存泄露、数据存储、垃圾回收机制一网打尽!
- 笔记:深入理解JVM 第3章 垃圾回收器与内存分配策略
- 垃圾回收机制和内存泄露
- 转载:《AS3 Expert》- Flash Player的垃圾内存回收机制:能否强制回收?
- PHP的内存泄露问题与垃圾回收
- C指针原理(48)-垃圾回收-内存泄露
- JAVA垃圾回收机制与内存泄露问题
- PHP的内存泄露问题与垃圾回收