我为配置新的类实例
做了很多工作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;
答案 0 :(得分:4)
我相信你指的是“对象文字”,应该是垃圾收集。
Flash使用两种垃圾收集方法 - 引用计数和标记和扫描。
如果没有被引用计数捕获,它最终应该通过标记和扫描来释放。
参考计数
堆上的每个对象都会跟踪指向它的内容的数量。每次创建对象的引用时, 对象的引用计数递增。删除引用时 对象的引用计数递减。如果对象为零 引用计数(没有任何指向它),它被添加到零 计数表(ZCT)。当ZCT已满时,扫描堆栈以查找 从堆栈到ZCT上的对象的任何引用。任何对象 没有堆栈引用的ZCT将被删除。
延迟引用计数的一个问题是循环引用。如果ObjectA和ObjectB彼此引用但没有其他引用 系统中的对象指向它们,它们永远不会为零 引用计数,因此永远不会有资格获得垃圾 使用引用计数收集。这是标记和扫描的地方 垃圾收集帮助。
<强>标记/扫描强>
在Flash Player或AIR中运行的应用程序具有多个GCRoot。 您可以将GCRoot视为具有对象的树的树干 作为分支机构的应用程序。舞台是一个GCRoot。装载机是 GCRoots。某些菜单是GCRoots。每个仍在使用的对象 通过应用程序可以从其中一个GCRoots到达 应用。 GCRoots永远不会被垃圾收集。
应用程序中的每个对象都有一个“标记位”。当Mark阶段 垃圾收集开始,所有这些标记位都被清除。该 MMgc跟踪应用程序中的所有GCRoot。垃圾 收集器从那些根开始,遍历每个对象和集合 它到达的每个对象的标记位。任何不再是的对象 无法从任何地方访问任何根目录 在应用程序中 - 它的标记位在Mark期间没有设置 相。收集器完成后,标记它找到的所有对象, 扫描阶段开始。任何没有设置标记位的对象都是 被摧毁并恢复了记忆。