iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >AS3 内存回收机制
  • 548
分享到

AS3 内存回收机制

机制内存 2023-01-31 04:01:10 548人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

       AS3相对于以前版本的功能增强了很多,在赋予它重任时,同时也要它付出代价:垃圾收集器不再支持自动为你收集垃圾。本文中,我为大家整理了一些资料。首先,我们先来了解下垃圾收集器是个什么东西?             (1)关于垃

       AS3相对于以前版本的功能增强了很多,在赋予它重任时,同时也要它付出代价:垃圾收集器不再支持自动为你收集垃圾。本文中,我为大家整理了一些资料。首先,我们先来了解下垃圾收集器是个什么东西?     
       (1)关于垃圾收集器
         垃圾收集器是一个后台进程它负责回收程序中不再使用的对象占用的内存。非活动对象就是不再有任何其他活动对象引用它。为便于理解这个概念,有一点非常重要,就是要意识到除了非原生类型(Boolean, String, Number, uint, int除外),你总是通过一个句柄访问对象,而非对象本身。当你删除一个变量其实就是删除一个引用,而非对象本身。
       (2)AS3的内存机制的方法: 
         <a>引用计数法:引用计数法是一种用于跟踪活动对象的较为简单的方法,它从ActionScript1.0开始使用。当你创建一个指向某个对象的引用,该对象的引用计数器加1;当你删除该对象的一个引用,该计数器减1.当某对象的计数器变成0,该对象将被标记以便垃圾回收器回收。
         
     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);
  // down to 0, the object can now be deallocated by the GC
 
         <b>引用计数法简单,它不会非CPU带来巨大的负担;多数情况下它工作正常。不幸地是,采用引用计数法的垃圾回收器在遇到循环引用时效率不高。循环引用是指对象交叉引用(直接、或通过其他对象间接实现)的情况。即使应用程序不再引用该对象,它的引用计数器仍然大于0,因此垃圾收集器永远无法收集它们。下面的代码演示循环引用:
       
     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, 等等) 并且难于用代码处理。FlashPlayer 6 和 7的XML对象有很多循环引用问题: 每个 XML 节点被它的孩子和父亲引用,因此它们从不被回收。幸运的是FlashPlayer 8 增加了一个叫做标识-清除的新垃圾回收技术。
          <c>标识-清除法 ActionScript3.0 (以及FlashPlayer 8) 垃圾回收器采用第2种策略标识-清除法查找非活动对象。FlashPlayer从你的应用程序根对象开始(ActionScript3.0中简称为root)直到程序中的每一个引用,都为引用的对象做标记。 接下来,FlashPlayer遍历所有标记过的对象。它将按照该特性递归整个对象树。并将从一个活动对象开始能到达的一切都标记。该过程结束后,FlashPlayer可以安全的假设:所有内存中没有被标记的对象不再有任何活动引用,因此可以被安全的删除。图1 演示了它如何工作:绿色引用(箭头)曾被FlashPlayer 标记过程中经过,绿色对象被标记过,白色对象将被回收。
       
       (3)AS3的内存机制的特点:
          1.  自动内存回收时间不确定。
          2.  当一个对象存在被其他对象引用时,这个对象不会被内存回收。
          3.  当一个流对象被加载,这个被加载的对象及已经占用了内存。
          4.  当一个可视化对象被声明,但没有添加到画面是占用部分内存,加到displayObject上后,占用全部该对象对象全部内存。
         5.  当加载重复对象,例如 加载100个同样的 XX.swf ,如果仅是加载,完成后没有引用,那么内存变化规律,波浪型的。如果某个时间内存回收。那么最后留在内存中的应该是大小近似于加载1个 XX.swf (比1个XX.swf 要大些),从此可以推理出,要是不同的东西被加载,那么最后即便是没有内存漏洞,在一定条件下常用的东西内存中可能也会至少保存每一个不同的东西。经我测试好像是这样的。(测多了可能还会有新发现呢)
         6.  引用的包括
         1)  对对象的存储: 例如 使用一个数组保存 某些对象,那么数组不释放,对象不可能释放
         2)  对事件的监听: 例如 监听过程实际上是使用一个对象保存关键字和关键字关联的事件,对事件关键字,查找然后找出对应的关联function。以下是as2代码。
         3)  强制回收方式,自动内存回收时间不确定,使用特殊的方法,该方法实际上触发一个错误引起资源回收,使无用的不被计数器引用的都要被回收。(暂时不被使用的,没有引用的那个被自动回收保留的那个一个回收掉),附件为强制回收类。
 
         7.  编写代码注意:
         1)  无用的对象,没有引用
         2)  降低类设计之间的耦合度,注意对象传递引用的设计等
         3)  单例模式,在合适的时候使用
         4)  事件循环嵌套造成多次执行,或事件触发循环bug。
         5)  对象重复加同样的监听
       
        (4)AS3开发需要注意的地方:
         1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉;
         2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除;
         3. 如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null; 
        4. 本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉;
        5. 除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失;
        6. 父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除;
        7. 如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除;
        8. 注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。
        9. 父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。
       
       (5)内存泄露举例:
         1. 引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null;
         2. 系统类泄露:使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除; 类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。
        3. 效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。
       4. SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null;
       5. 图片泄露:当Image对象使用完毕后要把source置null;(为测试);
       6. 声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null;
 

 
附件为强制回收类。调用方法:
import MyGc;
MyGc.GC()

--结束END--

本文标题: AS3 内存回收机制

本文链接: https://www.lsjlt.com/news/187845.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • AS3 内存回收机制
           AS3相对于以前版本的功能增强了很多,在赋予它重任时,同时也要它付出代价:垃圾收集器不再支持自动为你收集垃圾。本文中,我为大家整理了一些资料。首先,我们先来了解下垃圾收集器是个什么东西?             (1)关于垃...
    99+
    2023-01-31
    机制 内存
  • php内存回收机制是什么
    PHP的内存回收机制主要包括两个方面:引用计数和垃圾回收。1. 引用计数:PHP使用引用计数来跟踪内存中对象的引用数量。当一个对象被...
    99+
    2023-08-24
    php
  • qt内存回收机制是什么
    Qt内存回收机制是通过自动垃圾回收(Garbage Collection,GC)和对象树(Object Tree)来实现的。在Qt中...
    99+
    2023-09-16
    qt
  • JVM之内存分配和回收机制
    目录一、内存分配策略二、对象存活1.引用计数算法2.可达性分析算法3.再谈引用三、内存回收1.堆内存回收2.方法区回收总结前言 本篇主要介绍JVM内存分配和回收策略,内容主要节选自《...
    99+
    2023-05-18
    JVM内存分配 java内存回收
  • php内存回收机制怎么掌握
    要掌握PHP内存回收机制,可以关注以下几个方面:1. 了解PHP的垃圾回收机制:PHP使用了基于引用计数的垃圾回收机制。当一个变量的...
    99+
    2023-09-06
    php
  • python内存回收机制有什么优点
    Python的内存回收机制有以下几个优点: 自动化:Python的内存回收机制是自动的,程序员无需手动管理内存。Python会在...
    99+
    2023-10-20
    python
  • 源码解析python的内存回收机制
    目录一:建立对象引用计数1. 相关代码2. 代码解释二: 引用计数增加1. 相关源码2. 源码解释三:引用计数减少1. 相关源码2. 源码解释四:对象删除1. 相关源码2. 源码解释...
    99+
    2023-05-17
    python 内存回收 python源码
  • PHP 垃圾回收机制与内存管理
    php 的内存管理使用垃圾回收机制,它会在运行时自动释放不再使用的内存,基于引用计数原理运作。为了避免内存泄漏,遵循以下最佳实践:销毁不再需要的变量、避免循环引用、使用弱引用。 PHP...
    99+
    2024-05-03
    php 垃圾回收
  • 详解php内存管理机制与垃圾回收机制
    目录一、内存管理机制二、垃圾回收机制一、内存管理机制 先看一段代码: <?php //内存管理机制 var_dump(memory_get_usage());//获...
    99+
    2024-04-02
  • JavaScript内存回收机制的原理是什么
    这期内容当中小编将会给大家带来有关JavaScript内存回收机制的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.用局部变量和全局变量解释GCGC在回收内存...
    99+
    2024-04-02
  • 详解CLR的内存分配和回收机制
    一、CLR CLR:即公共语言运行时(Common Language Runtime),是中间语言(IL)的运行时环境,负责将编译生成的MSIL编译成计算机可以识别的机器码,负责资源...
    99+
    2024-04-02
  • Python的内存管理和垃圾回收机制
    本篇内容介绍了“Python的内存管理和垃圾回收机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对象的内存使用赋值语句是语言最常见的功能了...
    99+
    2023-06-02
  • Java内存分配与回收机制是什么
    本篇内容介绍了“Java内存分配与回收机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.运行时数据区域下图是Java虚拟机运行时的...
    99+
    2023-06-03
  • JavaScript中内存回收机制的原理是什么
    本篇文章为大家展示了JavaScript中内存回收机制的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JavaScript语言是一门优秀的脚本语言.其中包...
    99+
    2024-04-02
  • redis 过期策略及内存回收机制解析
    目录1. 过期策略1.1 过期的 key 集合1.2 定时扫描策略1.3 从库的过期策略2. 懒惰删除2.1 异步线程2.2 flush2.3 异步队列2.4 AOF Sync很慢的...
    99+
    2024-04-02
  • php内存管理机制与垃圾回收机制的示例分析
    这篇文章给大家分享的是有关php内存管理机制与垃圾回收机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、内存管理机制先看一段代码:<php//内存管理机制var_dump(memory_get...
    99+
    2023-06-15
  • redis 过期策略及内存回收机制的示例分析
    这篇文章主要介绍了redis 过期策略及内存回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。redis作为缓存的场景下,内存淘汰策略决定的redis的内存使用...
    99+
    2023-06-25
  • Redis内存回收策略
    目录概述maxmemory-policy 参数主动清理策略策略选择maxmemory-sample概述 Redis也会因为内存不足而产生错误 , 也可能因为回收过久而导致系统长期的停...
    99+
    2024-04-02
  • 垃圾回收机制
      我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是...
    99+
    2023-01-30
    机制 垃圾
  • JS中的内存泄漏与垃圾回收机制实例分析
    今天小编给大家分享一下JS中的内存泄漏与垃圾回收机制实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作