actionscript-3 - 垃圾收集到底是什么?在 ActionScript 3.0 中你是如何做到的?

标签 actionscript-3 actionscript garbage-collection

我已经在 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/

相关文章:

actionscript-3 - 如何更改Flash CS6中文本输入的字体大小

actionscript-3 - 加载外部 vdo 时询问属性 onMetaData 的错误消息但是,vdo 仍然可以播放

actionscript-3 - 如何在 ActionScript 中拆分音频文件

c# - 强制对数组进行垃圾回收,C#

actionscript-3 - 闪存 AS3 :Multiple function in one key?

ios - HTML/CSS/JS 是否可以通过 Adob​​e Air 编译来构建移动应用程序

Flash 中的 JavaScript

java - gc如何处理静态变量

mysql - 删除所有表中不再用于任何 FK 关系的所有行

actionscript-3 - ActionScript 3 : dynamic text help: scoring for game