FlashPlayer垃圾回收机制

在家上网赚钱更容易

《Flash/Flex应用开发内存监测及优化技巧》文章中提到了一些概述性内容,这里做出详细解释。

1、什么是垃圾回收器:

垃圾收集器简称GC( Garbage Collector ),是一段自动执行的逻辑,Flash Player的通过GC自动管理内存使用,回收程序中无用的对象来释放内存

2、垃圾收集器不支持自动收集垃圾:

AS3.0是运行在第二代虚拟机(AVM2)上的,它引入了E4X、sockets、byte 数组对象、新的显示列表模型、正则表达式、正式化的事件和错误模型以及其它特性并支持更复杂的组件。  巨大的能力意味着巨大的责任,引入这些新控件带来一个副作用:垃圾收集器不再支持自动为你收集垃圾。Flash Player有两种方法来查找非活动对象并移除它们:引用计数法和标识清除法,在后面会介绍到。

3、如果一个对象没有活动的引用指向它,则这个对象是可以被垃圾回收的:

除了非原生类型(Boolean, String, Number, uint, int除外),总是通过一个句柄访问对象,而非对象本身。当你删除一个变量其实就是删除一个引用。见下例

  var a:Object = {foo:”bar”}

 

  var b:Object = a;

  delete(a);

  trace(b.foo);

创建一个对象并赋给引用a,又将a赋给引用b。删除引用a,该对象不会被回收,因为b还引用它,输出b.foo会得到bar。如果使用delete(b);将b也删除,那么该对象就能够被垃圾回收了。

4、垃圾回收并不是一直在运行的,“收垃圾的人只在周五清晨来”:

首先介绍引用计数法和标识清除法。

引用计数法(Flash Player8之前的机制)是一种用于跟踪活动对象的较为简单的方法,它从ActionScript1.0开始使用。当你创建一个指向某个对象的引用,该对象的引用计数器加1;当你删除该对象的一个引用,该计数器减1。当某对象的计数器变成0,该对象将被标记以便垃圾回收器回收。引用计数法简单,它不会非CPU带来巨大的负担;多数情况下它工作正常。不幸地是,采用引用计数法的垃圾回收器在遇到循环引用时效率不高。循环引用是指对象交叉引用(直接、或通过其他对象间接实现)的情况。即使应用程序不再引用该对象,它的引用计数器仍然大于0,因此垃圾收集器永远无法收集它们。

从Flash Player8之后采用标识清除法。FlashPlayer从你的应用程序根对象开始直到程序中的每一个引用,都为引用的对象做标记。然后遍历所有标记过的对象。它将按照该特性递归整个对象树。并将从一个活动对象开始能到达的一切都标记。该过程结束后,所有内存中没有被标记的对象不再有任何活动引用,因此可以被安全的删除。

标记-清除法非常准确。但是,由于FlashPlayer 遍历你的整个对象结构,该过程对CPU占用太多。FlashPlayer 9 通过调整迭代标识-清除缩减对CPU的占用。该过程跨越几个阶段不再是一次完成,变成偶尔运行。

5、有了GC,为什么还会内存泄漏?

GC 的触发不是根据程序的清除指令来执行,而是根据内存分配情况来执行的。内存空间越紧俏, GC 才工作越勤快。 GC 只管标记,而且内存释放是异步执行的。

整个过程极不透明;

未被释漯p>

在家上网赚钱更容易

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值