狠狠撸

狠狠撸Share a Scribd company logo
Flash/ActionScript 3.0 内存管理
     路通展览展示设计(上海)有限公司
                  李正民
                软件工程师
Flash/ActionScript 3内存管理机制

?   数据存储

    1、基元数据类型 (primitive data type) — 值类型
      如:Boolean、int、Number、String和uint
         var _a:int = 10;
         var _b:int = a;
           _b = 9; //改变变量b的值为9
          trace (_a +“ ”+_b); // 10 9


    2、复杂数据类型 (complex data type) — 引用类型
      如:Array、Date、Error、Point、MovieClip等等
          var _array1:Array = new Array(1, 2, 3);
          var _array2:Array = _array1;
          _array2[1] = 4;
          trace(_array1 + "---> " + _array2); // 1 4 3 --> 1 4 3
Flash/ActionScript 3内存管理机制
?   内存释放--Flash Player策略

    1、引用计数( Reference Counting)

      var _a:Object = {Name:"Mike"}; // ref(_a) 1
      var _b:Object = _a; // ref(_a) 2

      delete _a; // ref(_a) 1
      trace(_b.Name); // Mike

      delete _b; // ref(_a) 0
      trace(_b.Name); // undefined


      通过引用计数,可以让 Flash Player决定何时释放一块内存区。
    从这里也可以更好地理解复杂数据类型为引用类型
Flash/ActionScript 3内存管理机制

?   内存释放--Flash Player策略

    引用计数的缺陷 — 两对象互相引用,循环引用

       var _a:Object = {}; // ref(_a) 1
       var _b:Object = {obj:_a}; // ref(_a) 2 ref(_b) 1
       _a.obj= _b; // ref(_b) 2
       delete(_a); // ref(_a) 1
       delete(_b); // ref(_b) 1


      引用计数虽然简单,也很实用,但是并不能解决所有问题。显然
    在上面的实例中,引用计数是无法正常工作,因此 Flash Player的GC
    也就不会去释放相应的内存块。这必然要求 Flash Player有另外的策
    略去清理这些内存块。
Flash/ActionScript 3内存管理机制
?   内存释放--Flash Player策略

    2、标识-清除法(Mark Sweeping)




      可以假设内存中没有被标记的对象不再有任何活动引用,因此可
    以被安全的删除
Flash/ActionScript 3内存管理机制

?   内存释放--Flash Player策略

    优点:非常准确      缺点:CPU占用率高

    Flash Player解决方案:
      a、在满足某个条件的时刻执行
      b、分段执行,不再一次完成整个过程

    上述解决方案导致 Flash Player垃圾回收器操作延期执行,从而引发
    下面一些问题:
     a、对象被删除,但是对象的 Enter_Frame事件还在继续执行
     b、对象被删除,但是对象的声音、视频还在继续播放
     c、对象被删除,但是对象的一个事件,动作还在继续触发 /执行
Flash/ActionScript 3内存管理机制
?   内存释放--编码规则

    1、引用计数归零:注意尽可能地将一些明显的引用计数清零

    2、Actionscript 3 弱引用
      a、事件弱引用
      b、Dictionary弱引用

    addEventListener(type:String,listener:Function,
                     useCapture:Boolean = false,priority:int = 0,
                     useWeakReference:Boolean = false ):void

      通过弱引用,在对象被删除,但未移除事件侦听器时,防止对象
    的事件函数成为永久函数。

    建议:勿忘记 removeEventListener 的调用,设置监听器引用为弱引
       用
Flash/ActionScript 3内存管理机制
?   内存释放--编码规则

    removedFromStage事件:从显示列表中直接删除显示对象或删除包含显示对
    象的子树时调度。故可以侦听这个事件,在这个事件做对象的清理工作。

     this.addEventListener(Event.REMOVED_FROM_STAGE, dispose, false, 0, true);
     var _btn:Sprite = new Sprite();
     _btn.addEventListener(MouseEvent.MOUSE_OVER, btnOver, false, 0, true);
     _btn.buttonMode = true;
     addChild(_btn);

     private function dispose(e:Event):void {
        this.removeEventListener(Event.REMOVED_FROM_STAGE, dispose);
       if(_btn){
           _btn.removeEventListener(MouseEvent.MOUSE_OVER, btnOver);
           _btn.removeEventListener(MouseEvent.CLICK, btnClick);
           removeChild(_btn);
      }
     _btn = null;
     }
Flash/ActionScript 3内存管理机制

?   内存释放--编码规则

    flash.utils .Dictionary 类的使用
    public function Dictionary(weakKeys:Boolean = false)
    指示Dictionary 对象在对象键上使用 “弱”引用

    var _MyObj:Object = new Object();
    var _myDict:Dictionary = new Dictionary(true);
    _myDict[_myObj] = new MovieClip();
    _myObject = null // 移除_myObject


      由于Dictionary 的对象键的弱引用性。故可以将一些复杂的对象
    用作Dictionary 的对象键,来设置复杂对象的弱引用性。
Flash/ActionScript 3内存管理机制

?   内存释放--编码规则

    package com.gskinner.utils {
    import flash.utils.Dictionary;
    public class WeakReference {
          private var dictionary:Dictionary;

             public function WeakReference(p_object:Object) {
                     dictionary = new Dictionary(true);
                     dictionary[p_object] = null;
             }

             public function get():Object {
                      for (var n:Object in dictionary) { return n; }
                      return null;
             }
         }
     }
Flash/ActionScript 3内存管理机制

?   内存释放--编码规则
      public class WeakReference extends Sprite{
       private var _timer:Timer = new Timer(5000, 0);
       private var _sound:Sound = new Sound();
       private var _channel:SoundChannel;
       private var _complete:Boolean = true;
       public function WeakReference() {
            _timer.addEventListener(Timer Event.TIMER, showMemory, false, 0, true);
           _timer.start();
           testSound();
       }
       private function showMemory(evt:TimerEvent = null):void{
            var _date:Date = new Date();
            trace("current time : " + _date.toLocaleString() + " " +
                  System.totalMemory / (1000 * 1000) + "MB");
             _date = null;
           if (true == _complete) testSound();
       }
Flash/ActionScript 3内存管理机制

?   内存释放--编码规则

       private function testSound():void{
                 if(null == _sound) _sound = new Sound();
                 _sound.load(new URLRequest("framer.mp3"));
                 _channel = _sound.play();
                 _channel.addEventListener(Event.SOUND_COMPLETE, complete);
                 _complete = false;
       }
       private function complete(evt:Event = null):void{
                 _channel.removeEventListener(Event.SOUND_COMPLETE, complete);
                 _channel = null;
                 _sound = null;
                 _complete = true;
       }


       Flash Player 9/10 执行结果不一样,在版本 9中会出现内存长
    时间得不到释放,并不停累积,但是最终会释放, 10不会出现这种情
    况。这种情况导致了 Dewar's项目客服端直接死掉。利用 Dictionary
    可以解决这个问题
感谢您的关注!

More Related Content

What's hot (7)

分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计
aleafs
?
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
?
颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门
颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门
颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门
Lucien Li
?
可用空间的管理
可用空间的管理可用空间的管理
可用空间的管理
倩怡 賴
?
惭别尘肠补肠丑别诲分享
惭别尘肠补肠丑别诲分享惭别尘肠补肠丑别诲分享
惭别尘肠补肠丑别诲分享
princehaku
?
Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解
liziqi7
?
微博实时搜索
微博实时搜索微博实时搜索
微博实时搜索
亚军 汪
?
分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计
aleafs
?
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
?
颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门
颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门
颈笔丑辞苍别,颈辞蝉,翱产箩别肠迟-颁基础入门
Lucien Li
?
可用空间的管理
可用空间的管理可用空间的管理
可用空间的管理
倩怡 賴
?
惭别尘肠补肠丑别诲分享
惭别尘肠补肠丑别诲分享惭别尘肠补肠丑别诲分享
惭别尘肠补肠丑别诲分享
princehaku
?
Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解Javascript 培训第四节 深入了解
Javascript 培训第四节 深入了解
liziqi7
?
微博实时搜索
微博实时搜索微博实时搜索
微博实时搜索
亚军 汪
?

Similar to 详解础厂3的内存管理机制,有效释放贵尝础厂贬内存,减少资源占用 (20)

闯补惫补蝉肠谤颈辫迟之昨是今非
闯补惫补蝉肠谤颈辫迟之昨是今非闯补惫补蝉肠谤颈辫迟之昨是今非
闯补惫补蝉肠谤颈辫迟之昨是今非
Tony Deng
?
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
jay li
?
箩蚕耻别谤测底层架构
箩蚕耻别谤测底层架构箩蚕耻别谤测底层架构
箩蚕耻别谤测底层架构
fangdeng
?
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
bigqiang zou
?
惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训
flynofry
?
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇
bluedavy lin
?
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
ted-xu
?
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
keelii
?
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
Ho Kim
?
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
jexchan
?
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
?
础惫尘2虚拟机浅析与补蝉3性能优化
础惫尘2虚拟机浅析与补蝉3性能优化础惫尘2虚拟机浅析与补蝉3性能优化
础惫尘2虚拟机浅析与补蝉3性能优化
Harvey Zhang
?
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
Peter Yi
?
JavaScript 脚本控件(二)
JavaScript 脚本控件(二)JavaScript 脚本控件(二)
JavaScript 脚本控件(二)
RANK LIU
?
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
Kris Mok
?
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
Ben Lue
?
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
WASecurity
?
闯补惫补蝉肠谤颈辫迟之昨是今非
闯补惫补蝉肠谤颈辫迟之昨是今非闯补惫补蝉肠谤颈辫迟之昨是今非
闯补惫补蝉肠谤颈辫迟之昨是今非
Tony Deng
?
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
潜力无限的编程语言闯补惫补蝉肠谤颈辫迟
jay li
?
箩蚕耻别谤测底层架构
箩蚕耻别谤测底层架构箩蚕耻别谤测底层架构
箩蚕耻别谤测底层架构
fangdeng
?
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
bigqiang zou
?
惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训
flynofry
?
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇
bluedavy lin
?
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
ted-xu
?
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
keelii
?
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
Ho Kim
?
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
jexchan
?
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
?
础惫尘2虚拟机浅析与补蝉3性能优化
础惫尘2虚拟机浅析与补蝉3性能优化础惫尘2虚拟机浅析与补蝉3性能优化
础惫尘2虚拟机浅析与补蝉3性能优化
Harvey Zhang
?
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
Peter Yi
?
JavaScript 脚本控件(二)
JavaScript 脚本控件(二)JavaScript 脚本控件(二)
JavaScript 脚本控件(二)
RANK LIU
?
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
Kris Mok
?
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
Ben Lue
?
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
WASecurity
?

More from 贵尝础厂贬开发者交流会 (20)

详解础厂3的内存管理机制,有效释放贵尝础厂贬内存,减少资源占用

  • 1. Flash/ActionScript 3.0 内存管理 路通展览展示设计(上海)有限公司 李正民 软件工程师
  • 2. Flash/ActionScript 3内存管理机制 ? 数据存储 1、基元数据类型 (primitive data type) — 值类型 如:Boolean、int、Number、String和uint var _a:int = 10; var _b:int = a; _b = 9; //改变变量b的值为9 trace (_a +“ ”+_b); // 10 9 2、复杂数据类型 (complex data type) — 引用类型 如:Array、Date、Error、Point、MovieClip等等 var _array1:Array = new Array(1, 2, 3); var _array2:Array = _array1; _array2[1] = 4; trace(_array1 + "---> " + _array2); // 1 4 3 --> 1 4 3
  • 3. Flash/ActionScript 3内存管理机制 ? 内存释放--Flash Player策略 1、引用计数( Reference Counting) var _a:Object = {Name:"Mike"}; // ref(_a) 1 var _b:Object = _a; // ref(_a) 2 delete _a; // ref(_a) 1 trace(_b.Name); // Mike delete _b; // ref(_a) 0 trace(_b.Name); // undefined 通过引用计数,可以让 Flash Player决定何时释放一块内存区。 从这里也可以更好地理解复杂数据类型为引用类型
  • 4. Flash/ActionScript 3内存管理机制 ? 内存释放--Flash Player策略 引用计数的缺陷 — 两对象互相引用,循环引用 var _a:Object = {}; // ref(_a) 1    var _b:Object = {obj:_a}; // ref(_a) 2 ref(_b) 1    _a.obj= _b; // ref(_b) 2    delete(_a); // ref(_a) 1    delete(_b); // ref(_b) 1 引用计数虽然简单,也很实用,但是并不能解决所有问题。显然 在上面的实例中,引用计数是无法正常工作,因此 Flash Player的GC 也就不会去释放相应的内存块。这必然要求 Flash Player有另外的策 略去清理这些内存块。
  • 5. Flash/ActionScript 3内存管理机制 ? 内存释放--Flash Player策略 2、标识-清除法(Mark Sweeping) 可以假设内存中没有被标记的对象不再有任何活动引用,因此可 以被安全的删除
  • 6. Flash/ActionScript 3内存管理机制 ? 内存释放--Flash Player策略 优点:非常准确 缺点:CPU占用率高 Flash Player解决方案: a、在满足某个条件的时刻执行 b、分段执行,不再一次完成整个过程 上述解决方案导致 Flash Player垃圾回收器操作延期执行,从而引发 下面一些问题: a、对象被删除,但是对象的 Enter_Frame事件还在继续执行 b、对象被删除,但是对象的声音、视频还在继续播放 c、对象被删除,但是对象的一个事件,动作还在继续触发 /执行
  • 7. Flash/ActionScript 3内存管理机制 ? 内存释放--编码规则 1、引用计数归零:注意尽可能地将一些明显的引用计数清零 2、Actionscript 3 弱引用 a、事件弱引用 b、Dictionary弱引用 addEventListener(type:String,listener:Function, useCapture:Boolean = false,priority:int = 0, useWeakReference:Boolean = false ):void 通过弱引用,在对象被删除,但未移除事件侦听器时,防止对象 的事件函数成为永久函数。 建议:勿忘记 removeEventListener 的调用,设置监听器引用为弱引 用
  • 8. Flash/ActionScript 3内存管理机制 ? 内存释放--编码规则 removedFromStage事件:从显示列表中直接删除显示对象或删除包含显示对 象的子树时调度。故可以侦听这个事件,在这个事件做对象的清理工作。 this.addEventListener(Event.REMOVED_FROM_STAGE, dispose, false, 0, true); var _btn:Sprite = new Sprite(); _btn.addEventListener(MouseEvent.MOUSE_OVER, btnOver, false, 0, true); _btn.buttonMode = true; addChild(_btn); private function dispose(e:Event):void { this.removeEventListener(Event.REMOVED_FROM_STAGE, dispose); if(_btn){ _btn.removeEventListener(MouseEvent.MOUSE_OVER, btnOver); _btn.removeEventListener(MouseEvent.CLICK, btnClick); removeChild(_btn); } _btn = null; }
  • 9. Flash/ActionScript 3内存管理机制 ? 内存释放--编码规则 flash.utils .Dictionary 类的使用 public function Dictionary(weakKeys:Boolean = false) 指示Dictionary 对象在对象键上使用 “弱”引用 var _MyObj:Object = new Object(); var _myDict:Dictionary = new Dictionary(true); _myDict[_myObj] = new MovieClip(); _myObject = null // 移除_myObject 由于Dictionary 的对象键的弱引用性。故可以将一些复杂的对象 用作Dictionary 的对象键,来设置复杂对象的弱引用性。
  • 10. Flash/ActionScript 3内存管理机制 ? 内存释放--编码规则 package com.gskinner.utils { import flash.utils.Dictionary; public class WeakReference { private var dictionary:Dictionary; public function WeakReference(p_object:Object) { dictionary = new Dictionary(true); dictionary[p_object] = null; } public function get():Object { for (var n:Object in dictionary) { return n; } return null; } } }
  • 11. Flash/ActionScript 3内存管理机制 ? 内存释放--编码规则 public class WeakReference extends Sprite{ private var _timer:Timer = new Timer(5000, 0); private var _sound:Sound = new Sound(); private var _channel:SoundChannel; private var _complete:Boolean = true; public function WeakReference() { _timer.addEventListener(Timer Event.TIMER, showMemory, false, 0, true); _timer.start(); testSound(); } private function showMemory(evt:TimerEvent = null):void{ var _date:Date = new Date(); trace("current time : " + _date.toLocaleString() + " " + System.totalMemory / (1000 * 1000) + "MB"); _date = null; if (true == _complete) testSound(); }
  • 12. Flash/ActionScript 3内存管理机制 ? 内存释放--编码规则 private function testSound():void{ if(null == _sound) _sound = new Sound(); _sound.load(new URLRequest("framer.mp3")); _channel = _sound.play(); _channel.addEventListener(Event.SOUND_COMPLETE, complete); _complete = false; } private function complete(evt:Event = null):void{ _channel.removeEventListener(Event.SOUND_COMPLETE, complete); _channel = null; _sound = null; _complete = true; } Flash Player 9/10 执行结果不一样,在版本 9中会出现内存长 时间得不到释放,并不停累积,但是最终会释放, 10不会出现这种情 况。这种情况导致了 Dewar's项目客服端直接死掉。利用 Dictionary 可以解决这个问题