我已经在ActionScript中编程了大约6年,但在AS3问世之前从未听说过"垃圾收集"一词.为什么我们现在要担心它,而且从来没有这样做过?究竟是什么呢?从我读过/听过,它是与内存管理/泄漏等-甚至是我不明白许多,除了它是与性能.
我最近为我的一位艺术家朋友推出了一个网站,它是在AS3中完成的.我注意到它占用了大量资源.显然,这是我想要改进的.我猜它与没有垃圾收集的事实有关?!不幸的是,我对从哪开始就没有任何想法,因为我觉得我需要更好地了解它是什么以及如何在AS3中专门做到这一点.
对于好奇,这里是URL:http://www.jeffperrott.com
垃圾收集器是运行时(在您的情况下是Flash或AIR播放器)中清除未使用内存的一部分.ActionScript总是像所有脚本语言一样拥有垃圾收集(例如javascript,perl,ruby等等).你只是没有看到它为AS讨论过多.
基本思想是创建的每个对象都需要一些内存,而变量会引用这些对象.在没有对它的引用之前,对象的内存不会"释放"回可用内存池.垃圾收集器跟踪哪些对象具有对它们的引用,并且以不同的间隔将回收具有零引用的那些内存(即没有指向它的变量,因此没有代码甚至可以找到它来使用它).如果有任何引用*,则无法回收对象的内存,以防代码的某些部分决定将来使用它.
如果您的程序看起来是在泄漏内存(不断增长,从不稳定大小或缩小),那么您可能将对象放在散列或数组或其他一些集合对象中.这个对象显然保留了对它内容的引用,因此永远不会删除这些内容.
请注意,在ActionScript中,通过将闭包用作事件处理程序,可以很容易地创建"泄漏".如果您的处理程序可以访问已分配但从未为空的变量,那么这些变量将保留其引用,并且只要注册了事件处理程序,它们指向的对象就不会被垃圾回收.
function registerHandler(neverReleased:Object) { ... addEventHandler(function (e:Event) { ... }); }
直接调用垃圾收集器几乎总是坏事(tm),Flash/Flex中的垃圾收集器非常好.首先找出对象的保存位置,然后释放它们,让GC按照自己的计划进行操作.
*除了循环引用外,这个答案的范围有点远.