flex垃圾回收机制
来源:互联网 发布:windows任务管理器画图 编辑:程序博客网 时间:2024/06/07 06:50
ActionScript3.0垃圾回收器使用两种方法定位无引用的对象,引用计数法和标识清除法。
- 引用计数法,一种用于跟踪活动对象的较为简单的方法,它从ActionScript1.0开始使用。当你创建一个指向某个对象的引用,该对象的引用计数器 加1;当你删除该对象的一个引用,该计数器减1。当某对象的计数器变成0,该对象将被标记以便垃圾回收器回收。
引 用计数法简单,它不会非CPU带来巨大的负担;多数情况下它工作正常。不幸地是,采用引用计数法的垃圾回收器在遇到循环引用时效率不高。 - 标识清除法,flash player遍历整个对象树,将一切活动对象进行标记,标记过程结束后,没有被标记的就认为可以删除了,当运行GC的时候就把这些对象删除。标识是指强引用。标记-清除法非常准确。但是,由于 Flash Player 遍历你的整个对象结构,该过程对CPU占用太多。Flash Player 9 通过调整迭代标识-清除缩减对CPU的占用。该过程跨越几个阶段不再是一次完成,变成偶尔运行。
内存泄露的原因:
- 增加了监听,不需要的时候没有删除;
- 没有移除显示列表;
- 生成的实例没有销毁;
- 。。。
总之,就是存在强引用。
避免方法:
在不需要用到某个实例的时候,消除与其关联的强引用。比如,移除不再使用的监听器,不再使用的显示对象移除显示列表等。最保险的方法是每个类有自己的GC方法,当不用的时候对应的实例运行一下。
强制Flex垃圾回收:(即著名的hack方式)
通过故意让SWF在运行时出错,然后throw出错误,而同时通过catch error来继续运行SWF文件。而垃圾回收机则会在SWF抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。
下面是我找到一个通过这种hack方式处理垃圾回收的代码:
- package util
- {
- 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;
- }
- }
- }
关于上面代码如何使用,目前大致上有两种使用方法:
1、在项目开始的时候,建立一个timer,然后每个一分钟就执行一次Memory.gc();
2、找一台配置一般的机器,然后运行你要的程序。然后在CPU、Memory占用很高的地方,记录一下当时的内存值,之后再自认为需要的地方(例如位图运算、Effect效果完成后等地方),执行Memory.gc();
0 0
- flex 垃圾回收机制
- flex垃圾回收机制
- Flex垃圾回收机制
- flex垃圾回收机制
- flex 垃圾回收
- 垃圾回收机制--回收周期
- 垃圾回收机制
- 垃圾回收机制
- 垃圾回收机制
- .net 垃圾回收机制
- 垃圾回收机制
- java垃圾回收机制
- 垃圾回收机制
- 垃圾回收机制
- .NET垃圾回收机制
- php垃圾回收机制
- C++垃圾回收机制
- php垃圾回收机制
- U盘复制东西提示文件太大怎么办?
- ZOJ 2541 Goods Transportation
- HDU_4788_Hard Disk Drive(打表)(13成都现场H题)
- 杭电 2058 The sum problem
- 黑马程序员--JQuery学习笔记
- flex垃圾回收机制
- 编写更好的jQuery代码的建议
- JBoss 系列九十: 红帽发布 JBoss BPM Suite 6 最终版本
- 误删/var/lib/dpk文件夹
- 圆角ImageView
- 九度oj 题目1201:二叉排序树
- 黑马程序员--ASP.NET基础学习笔记
- OpenGL FBO 对象
- IOS开发之----常用函数和常数