我已经在 ActionScript 中编程大约 6 年了,但在 AS3 出现之前从未听说过“垃圾收集”这个词。为什么我们现在要担心它,以前从来没有?确切地说,它是什么?从我读到/听到的,它与内存管理/泄漏等有关 - 甚至我对它的了解不多,除了它与性能有关。
我最近为我的一位艺术家 friend 推出了一个网站,它是在 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 按照它自己的时间表工作。
*除了 circular references这有点超出了这个答案的范围。
关于actionscript-3 - 垃圾收集到底是什么?在 ActionScript 3.0 中你是如何做到的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023962/