AS3.0 中的 变量回收机制

来源:互联网 发布:新网域名转移到万网 编辑:程序博客网 时间:2024/06/05 12:04

简介

简单地来说,AS3.0 中的变量回收机制可以用一句话概括,当对象在程序中不能被访问到时,其就会被垃圾回收所标记,但不会被立即回收。当程序所占空间达到极限时,可回收的对象才会被回收。

策略: Incremental Mark and Sweep

我们并不能知道被标记为可回收的对象何时会被回收,最理想的状态时,当一个对象不可被访问时,它立刻就会被回收,但是事实并非如此。由于回收对象需要耗费时间,这可能会导致某些程序运行缓慢或得不到响应,AS不会立刻将可回收的对象从内存中移除,而是周期性地进行这项工作。

下面具体讲一讲AS的回收机制。

  1. 当flash程序运行时,它会向操作系统请求一个固定大小的内存来存储对象。
  2. 当程序运行时,它分配在内存中的对象有些可以被访问到,有些不可以被访问到。当对象足够多时,AS会进行对象回收。
  3. 在回收过程中,可以被访问到的对象会继续存在,不可被访问到的对象会被从内存中清除。

由于在大型程序中,检查对象是否可访问会耗费时间,所有AS会将这项工作分成很多块在程序运行时交错进行。另外,AS也采用了 deferred reference counting 来改善垃圾回收的表现。

AS的垃圾回收在程序会在对象达到flash运行内存极限的时候触发,但是不能保证什么时候会触发。程序员也不能强制AS进行垃圾回收。

移除对象

上面我们已经讲过,移除一个对象需要使其不可被访问到,所以我们需要做以下两点:

  1. 将对象从包含其的数组等容器中移除,若是显示对象,还需要从显示列表中移除;
  2. 将引用该对象的所有变量设为null, 注意AS中的对象copy方式。

移除事件

需要注意的是,当对象可被回收但又还未被从内存中移除时,该对象仍然可以响应事件。所以我们需要移除这些事件,需要注意以下几点:

  1. 移除该对象中注册的事件
  2. 停止计时器等
  3. 确保因该对象被移除而导致的其他不可被访问的对象中的事件也被移除

总结

写的比较简略,欢迎讨论!

0 0
原创粉丝点击