Actionscript 3 什么是垃圾收集?在ActionScript3.0中如何进行垃圾收集?

Actionscript 3 什么是垃圾收集?在ActionScript3.0中如何进行垃圾收集?,actionscript-3,actionscript,garbage-collection,Actionscript 3,Actionscript,Garbage Collection,我已经用ActionScript编程6年了,但在AS3问世之前,我从未听说过“垃圾收集”这个词。为什么我们现在就要担心,而以前从来没有担心过?确切地说,这是什么?从我所读到的/听到的,它与内存管理/泄漏等有关——甚至我也不太了解,除了它与性能有关 我最近为我的一位艺术家朋友创建了一个网站,它是在AS3中完成的。我注意到它占用了很多资源。显然这是我想要改进的地方。我猜这和没有垃圾收集有关?!不幸的是,我一点也不知道该从哪里开始,因为我觉得我需要更好地理解它是什么,以及如何在AS3中具体执行它 出于

我已经用ActionScript编程6年了,但在AS3问世之前,我从未听说过“垃圾收集”这个词。为什么我们现在就要担心,而以前从来没有担心过?确切地说,这是什么?从我所读到的/听到的,它与内存管理/泄漏等有关——甚至我也不太了解,除了它与性能有关

我最近为我的一位艺术家朋友创建了一个网站,它是在AS3中完成的。我注意到它占用了很多资源。显然这是我想要改进的地方。我猜这和没有垃圾收集有关?!不幸的是,我一点也不知道该从哪里开始,因为我觉得我需要更好地理解它是什么,以及如何在AS3中具体执行它


出于好奇,这里有一个URL:

我对AP3的实现一无所知,但有人必须发布以下内容:)


基本上,您使用指向数据的指针(嗯,引用)。超出范围的引用将被删除。每当没有引用指向数据时,数据将被标记为垃圾收集。GB线程(进程或守护进程)将及时释放用于分配标记数据的所有资源。

通常情况下,您或您的开发运行时必须在某个时间点手动处理内存,以便在内存中为应用程序数据创建空间,或在应用程序完成后清除内存。如果运行时中没有GC(垃圾收集器),则需要手动处理应用程序中变量和对象的内存空间的创建和删除

一个例子是本地C++。在C++程序员真正能完成应用程序之前,他们必须进行处理内存本身的基础工作。他们向操作系统请求内存,他们添加分配,他们向内存中添加对象和数据,他们稍后删除对象和数据,他们取消分配内存,他们清理内存并再次将其释放到操作系统

使用GC,GC会为您完成所有工作。您所要做的就是告诉GC(通常通过实例化一个对象)您计划使用内存,GC会计算出您需要多少内存,向操作系统请求,分配并添加您的数据。然后,它会不时检查应用程序是否仍在使用该对象。如果不是,则会删除对象、取消分配、清理对象并释放回操作系统。所有这些都是为你做的,所以你,程序员,可以专注于你的程序。VB 6.0和C#/VB.NET就是一个例子


编辑:这是一个极其简化的解释。实际上还有很多,但这个答案应该回答这里提出的基本问题。

垃圾收集器是运行时(在您的情况下是Flash或AIR player)清理未使用内存的一部分。ActionScript与所有脚本语言(如javascript、perl、ruby等)一样,一直都有垃圾收集功能,但您对它的讨论并不多

其基本思想是,创建的每个对象都需要一些内存,并且您的变量保持对这些对象的引用。对象的内存不会“释放”回可用内存池,直到不再有对它的引用。垃圾收集器跟踪哪些对象引用了它们,并以不同的时间间隔回收那些引用为零的对象的内存(即没有指向它的变量,因此没有代码可以找到它来使用它)。如果存在任何引用*对象的内存无法回收,以防代码的某些部分决定将来使用它

如果您的程序似乎正在泄漏内存(不断增长,大小从未稳定或缩小),那么您可能正在将对象放置在散列或数组中,或者其他一些集合对象中。这个对象显然维护了对其内容的引用,因此这些内容永远不会被删除

请注意,在ActionScript中,使用闭包作为事件处理程序很容易创建“泄漏”。如果处理程序可以访问已分配但从不为空的变量,那么这些变量将保留其引用,并且只要注册了事件处理程序,它们指向的对象就不会被垃圾收集

function registerHandler(neverReleased:Object) {
    ...
    addEventHandler(function (e:Event) {
            ...
        });
}
直接调用垃圾收集器几乎总是一件坏事(tm),Flash/Flex中的垃圾收集器非常好。首先找出对象所在的位置,然后释放它们,让GC按照自己的时间表工作


*除了有点超出这个答案的范围之外。

在Chadwick的答案中添加:

如果您向图像添加EventHandler,但在图像不再显示时不删除EventHandler,则垃圾收集器无法恢复图像占用的内存。

每次使用“new”关键字创建对象时,您都在将声明权押在一块内存上[1]。假设您通过编写
var exampleunit:uint=new uint()来生成uint。ActionScript对计算机说“嘿……我需要大约……四个字节的内存”,计算机回答“好的,酷,使用从[某个内存地址,比如0x7B3208C1]开始的四个字节”[2]。所以当你说
var someString:String=“blah”
您在内存中声明一个空间,用一些信息填充它(在本例中,它是
“blah”
),创建一个标签(在本例中,它是
someString
),并将标签添加到内存中的该空间

现在标签实际上并不与数据本身相关联,而是与内存中包含数据的位置相关联。这似乎令人困惑,因为确实如此,但出于某些原因,这完全有道理。ActionScript中的所有对象都是类型,这意味着该对象包含某些数据段的内存地址,而不是数据本身。这与对象形成对比