Flash Player的garbage collection(GC)分两种运行方式,一种是“引用计数法”(Reference Counting),一种是“标记-清除法”(Mark Sweeping)。

引用计数法是通过计算指向某个对象的引用的数量来确定是否清除该对象。如果一个对象的引用数量为0,表示程序无法再访问到该对象,则清除该对象;如果引用计数不为0,则不清除。这种方法运行代价较小,但是这种方法无法清除存在循环引用关系的对象集合。标记-清除法是从程序的根对象开始,遍历每个引用指向的对象。遍历经过的对象,则将其标记。最后清除所有没有打上标记的对象。这种方法比较彻底,但是运行代价较高。

FlashPlayer运行GC的时间并不固定,它会根据你的内存的占用情况来决定运行GC的时间。它会根据用户机器的内存值来设定一个阀值,然后将程序的占用内存量保存在该阀值左右。

正因为FlashPlayer这种“不确定”的GC机制,所以我们所要做的主要工作是确保创建的对象在不需要的时候可以被释放。确保对象可以被释放的大原则是没有外部引用指向该对象,除了一般情况下的没有将外部引用显示地设为null之外,以下的情况也会导致对象无法释放:

没有remove监听的事件。比如,A对象对某个事件进行监听,监听函数(Event Handler)存在于B对象中,则相当于A对象会保存一个B对象的方法的引用,会导致B对象的内存无法释放。

解决方法:注意remove掉监听事件;或者在调用addEventListener()时,将监听函数设为弱引用,但这种做法只适合一次性的监听。

使用BindingUtils.bindSetter()、ChangeWatcher.watch()绑定某个对象之后,没有清除该绑定。道理同1,其实绑定某个对象,也就是监听其发出的PropertyChange事件。

解决方法:使用ChangeWatcher.unwatch()来清除绑定关系。

声明了样式,并在样式中使用了嵌入式资源。比如在

解决方法:解决方法很多,可以使用动态加载的样式,或者使用一个类或模块(Module)专门管理样式,这些解决方法取决程序的架构设计。

使用ExternalInface.callBack()声明了对外的API函数。类似于情况1,一个对象对外声明了API,就使外部保存了指向该对象的引用。

解决方法:如果之前使用了ExternalInface.callBack("APIName", functionName)声明了一个API,则可以使用ExternalInface.callBack("APIName", null)取消该API。

某些控件(类似TextInput),或者由这类控件构成的自定义组件,当焦点在这些控件上时,即使从DisplayList移除掉这些控件并删除引用,这些控件对象也无法释放。这个问题还有人提出来是一个Bug(http://bugs.adobe.com/jira/browse/SDK-14781)。这个问题估计和flash的焦点管理机制有关。

解决方法:目前的解决方法只能是等焦点重新转移到其他控件上(比如点击了其他控件),如此之前的控件对象就可以被GC释放。

那应该在什么时候做好垃圾清理的准备工作呢?之前有的文章说应该监听组件的removeFromStage事件,在其处理方法中进行垃圾清理的准备工作(清除引用,删除监听器,清除绑定关系,取消对外API等工作)。

其实这种方法不太确切。因为removedFromStage事件是当组件从DisplayList上移除的时候发出的,并不代表该组件对象的生命周期已经终结。只要程序保留了该组件对象的引用,可以再重新把该组件对象添加到DisplayList上(此时,该组件对象会发出addedToStage事件)。如果单纯在removedFromStage事件的监听函数中做该对象的垃圾清理准备工作,当组件重新被使用的时候,可能导致该组件对象原来的状态被破坏而无法使用。

因此,比较好的实践方法应该是,利用addedToStage、removedFromStage两个事件的对应关系,在removedFromStage事件的处理方法中执行垃圾清理的准备工作(清除引用,删除监听器,清除绑定关系,取消对外API等作),而在addedToStage事件的处理方法中执行removedFromStage事件的处理方法的反操作(设置引用、添加监听、设定绑定关系、设置API...也可以认为是一个组件对象的初始化操作),这样就可以保证一个组件对象被从DisplayList上移除后,可以释放相应内存;如果保存其引用,并将其重新添加到DisplayList上,又可重新使用。

最后翻译一段关于内存清理的建议:

usage of instance members instead of static members can easily be detected with the profiler (replace by static members where possible)

使用实例成员(instance members),而不是用静态成员(static members),可以更容易地被profiler检查到。因此,尽可能地使用实例成员,而不要用静态成员。

usage of weak references and / or removal of eventListeners after consumption of the event (if posible) helps reducing the memory usage

在事件完成之后,将其设为引用 而且/或者(and / or) 将其remove掉,有助于减少内存使用。

moduleLoader.unloadModule leaks memory, use moduleLoader.url=null instead

moduleLoader.unloadModule()会导致内存泄露,因此建议使用将moduleLoader.url=null.

module memory is freed at arbitrary times (not at unload)

module内存的释放时间是不确定(并不是在unload的时候)。

runnning debug version of modules leaks huge amounts of memory no matter which container is used

使用debug版本的module会导致大量的内存泄露,不管其容器是否使用。

declaring modules as modules in the configuration of a flex builder 3 project (and not as applications like in FlexBuilder 2) and optimizing for a specific application reduces module size drastically

将一个程序块声明为module,而不要将其声明为application,并且设置各module专门为一个application进行优化,能大量节约内存。

forcing garbageCollection (double LocalConnection.connect hack) is necessary in order to measure leaks and to keep memory under control

在适当的时候,为了内存可控,可强制使用垃圾收集器(garbageCollection),方法如下:

try {

import flash.net.LocalConnection;

var conn1:LocalConnection = new LocalConnection ();

var conn2:LocalConnection = new LocalConnection ();

conn1.connect("gc");

conn2.connect("gc");

}catch(e:Error){}

use the release version of the module swf

使用release版的module swf。

uninstall the debug flash player ("uninstall_flash_player.exe")

卸载debug版的flash player。

install the release version of the flash player ("install_flash_player_active_x.msi")

安装release版的flash player。

flash怎么强制gc_浅谈Flash的垃圾回收机制相关推荐

  1. 浅谈python的垃圾回收机制以及内存管理

    背景介绍 Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然 ...

  2. 浅谈虚拟机的垃圾回收

    最近在极客时间上的<深入拆解Java虚拟机>课堂上学习,所以记录下了学习的笔记,与及对其相关的内容进行思考和拓展. 1. 如何辨别一个对象是存是亡? 用来辨别的计算方法有两种: 引用计数法 ...

  3. [转]我的FLASH情结2010——浅谈FLASH WEB GAME与创业(下)

    我的FLASH情结2010--浅谈FLASH WEB GAME与创业 ★前端与美术的配合 →老闪客们应该都知道,FLASH这款软件在历史很长一段时间内都是用来做动画的,闪客和美术在这段时间内本就是同根 ...

  4. 我的FLASH情结2010—— 浅谈FLASH WEB GAME与创业

    声明:本文系转载,对原文有删节,出处链接地址 ★目录: →FLASH WEB GAME的系统架构 →FLASH WEB GAME的前端架构与人事分工 →前端与美术的配合 →前端与后端的配合 ===== ...

  5. 【推荐】我的FLASH情结2010——浅谈FLASH WEB GAME与创业(2)

    ★FLASH WEB GAME的前端架构与人事分工 →前端的主程序架构和模块划分与人手和人事分工是紧密联系在一起的,而这些很大程度上又是由项目本身决定的.纵观现在国内绝大多数FLASH WEB GAM ...

  6. 浅谈SQL Server内部运行机制

    原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...

  7. 浅谈ASP.NET的内部机制(一)

    浅谈ASP.NET的内部机制(一) 前言:当一个Http请求发送给一个aspx页面时,服务器进行了哪些操作?又如何来解析这个请求?ASP.NET在接收请求后是怎么运行的,如怎么编译以及怎么样用托管的代 ...

  8. 浅谈V8引擎中的垃圾回收机制

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  9. 浅谈ASP.NET的内部机制(二)

    浅谈ASP.NET的内部机制(二)         前言:大家知不知道,一个Http Request是如何被传递给ASP.NET的?而且ASP.NET是如何知道一个 Http Request是请求的. ...

最新文章

  1. Error:(108) No resource identifier found for attribute #39;style#39; in package #39;android#39;
  2. 区块链3.0:侧链与跨链行业趋势报告|OK资本
  3. C#——简单的计算器(仿Windows 10计算器)
  4. python中解决死锁的方法
  5. C++ Maps MultiMaps
  6. SpringCloud Hoxton版微服务-RestTempalte + @LoadBlanced 实现负载均衡
  7. Java学习关于集合框架的基础接口--Collection接口
  8. vue ---- webpack -插件 html-webpack-plugin
  9. 【文本分类】几个可作为Baseline的模型
  10. YOLOv5与Faster RCNN相比。 谁赢?
  11. linux Vi操作和使用方法详解
  12. C语言知识点复习梳理
  13. Pandas的介绍和使用
  14. 2020计算机分数线,成都计算机电子信息学校2020年招生录取分数线
  15. 将网易博客搬至CSDN
  16. “二选一”突袭,暗战“山姆”?
  17. java调用天气预报案例
  18. 单机版Docker Swarm安装及试用
  19. 你只需画草稿,剩下都交给AI!哈佛『机器学习』最新课程;Evernote收费又难用?试试这款开源工具;提示工程资源整合笔记;前沿论文 | ShowMeAI资讯日报
  20. 对SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层等层的理解

热门文章

  1. JavaSE基础(47) super(超类)
  2. 1.公司代码管理工具GIT与SVN
  3. 记录~页面table数据导出到excel时,数字或字符串显示成科学计数法的解决办法
  4. map取值,key不存在的情况
  5. linux怎样关闭网卡
  6. 【复习回顾、继承、抽象类、模板设计模式】
  7. 精致的像素级别的风格转换 ----- Deep Image Analogy
  8. mysql中的utf8mb4、utf8mb4_unicode_ci、utf8mb4_general_ci
  9. Scilab : 数据可视化
  10. 有1/2/3/4 四个数字,能组成多少个互不相同的三位数?都是多少?