转载- c#在路上时间:2010-12-5 17.35
1.Flex 虚拟机即AVM,虚拟机本身会自己管理内存,进行gc,垃圾回收。虚拟机可以回收不是用的内存,但是由于程序员本身的代码原因,会造成内存泄露。内存回收是在后台的 一个进程,它释放那些不在被应用所使用的对象所占用的内存。不在被应用所使用的对象是指那些不会再被活动着的对象所引用的对象。出过基本类型之外,对象直接传递的是对象的引用,而不是对象本身。AS 采用引用计数法和标记清除法来标示对象的引用,判断是否对其进行垃圾回收。 2.引用计数法 示例代码: var a:Object={fool:"bar"}; //对象a的引用计数为1(a) var b:Object=a; //现在a的引用计数器为2(a) delete a; //a的引用计数器变为1 delete b; //b 的引用计数器变为0, 现在a可以被gc了。 对象循环引用之后有些引用不会被gc 3.标记删除法 第二种GC策略为标记清除法。 flashplayer 从root 查询不在被使用的引用,然后删除整个树包括子节点。这种方法比较耗时,所以不是经常的采用这种方法来gc。 4.gc的回收时机 (1),何时真正执行垃圾回收不可预知 (2),垃圾回收总是在请求内存时触发,而不是在对象删除时发生。 5.强制回收垃圾的技巧。 官方并没有提供api来gc 强制回收垃圾的代码: 代码 import flash.net.LocalConnection; import flash.system.System; public class Memory { public function Memory() { //TO DO } public static function gc() : void { try { new LocalConnection().connect( 'foo' ); new LocalConnection().connect( 'foo' ); } catch ( e : * ) {} } public static function get used() : Number { return System.totalMemory; } } 6,常见内存泄露情况 1,单例模式中引用的其他对象,如果不删除则可能造成内存的泄露。 2,无限次触发的timer不会被垃圾回收。 3,隐式方式建立的对象之间的引用。即绑定与,对象添加事件监听器,则可能产生内存泄露。自引用的方式,即为对象添加监听处理,且为本身的方法。 7,避免内存泄露的一些方法: 1,不使用的资源一定要回收,图像,graphics 对象等等,timer对象模块的加载,音乐播放的停止等。 8,提高flex应用性能的技巧 1.不要使用new 来创建数组,要使用 var a=[]; 2.创建数组的性能影响很大,不要创建的太多。 3.最快的数组的复制方法 var copy:Array=souraceArray.concat(); 4.数组中读取元素是给数组赋值的两倍。 5.使用静态方法可以提高性能。 6.设置一些常量。 7.类不能派生时,用final修饰。 8.类型转换时,先解决未知的和不真确的对象类型。 9.谨慎使用uint ,for 循环中使用int 10.乘法性能高于除法。 11.循环中的数组 用 var length:int=array.lenth;for(var i:int=0;i<leng;i++) 12.使用正则表达是rexex进行校验,用字符串的方法进行查找。 13.内存平稳机制。 14.避免使用setStyle方法,在flex 框架中最消耗性能的方法之一 15.不要使用过多的容器 16.应用的FrameRate应视为69fps