1

我经常这样做来配置类的新实例

var myVar = new MyClass({param:1,param2:true,param3:"hello"});

这个匿名对象会被垃圾收集吗?

使用后创建和销毁对象会更好吗?

var myConfig:Object = {param:1,param2:true,param3:"hello"}
var myVar = new MyClass(myConfig);
myConfig = null;
4

1 回答 1

4

我相信您指的是“对象文字”,它应该被垃圾收集。

Flash 使用两种垃圾收集方法——引用计数和标记和清除。

如果没有被引用计数捕获,它最终应该被标记和扫描释放。

引用计数

堆上的每个对象都跟踪指向它的事物的数量。每次创建对对象的引用时,对象的引用计数都会增加。删除引用时,对象的引用计数会减少。如果对象的引用计数为零(没有任何东西指向它),则将其添加到零计数表 (ZCT)。当 ZCT 已满时,扫描堆栈以查找堆栈中对 ZCT 上的对象的任何引用。ZCT 上没有堆栈引用的任何对象都将被删除。

延迟引用计数的问题之一是循环引用。如果 ObjectA 和 ObjectB 相互引用,但系统中没有其他对象指向它们,则它们的引用计数永远不会为零,因此永远不会有资格使用引用计数进行垃圾回收。这就是标记和清除垃圾收集有帮助的地方。

标记/扫描

在 Flash Player 或 AIR 中运行的应用程序具有多个 GCRoot。您可以将 GCRoot 视为一棵树的树干,而应用程序的对象则视为分支。Stage 是一个 GCRoot。加载器是 GCRoots。某些菜单是 GCRoots。应用程序仍在使用的每个对象都可以从应用程序中的一个 GCRoot 访问。GCRoot 永远不会被垃圾回收。

应用程序中的每个对象都有一个“标记位”。当垃圾回收的标记阶段开始时,所有这些标记位都会被清除。MMgc 跟踪应用程序中的所有 GCRoot。垃圾收集器从这些根开始,跟踪每个对象并为它到达的每个对象设置标记位。从任何根不再可访问的任何对象不再可从应用程序中的任何位置访问 - 在标记阶段不会设置其标记位。一旦收集器完成标记它找到的所有对象,扫描阶段就开始了。任何没有设置标记位的对象都会被销毁并回收其内存。

于 2012-05-26T01:57:00.820 回答