在要对象的对象中设置对null的引用?

Bar*_*lom 5 flash clr garbage-collection jvm actionscript-3

// in a garbage collected VM, destroy someObject:
someObject.a = null;
someObject.b = null;
someObject = null;
Run Code Online (Sandbox Code Playgroud)

我听说在像Java或C#这样的好的虚拟机中,你不应该这样做.设置someObjecta,并bnull因为GC需要更长的时间来找出对象将减缓垃圾收集ab以前被称为不再被引用,而如果你离开他们完好清理时,GC将立即检查在他们身上someObject.

假设我听到的是真的(如果没有,请纠正我),AVM2,ActionScript 3 VM(特别是最新版本的Flash Player)是否相同?

我问的原因是我有一个同事这样做,因为他在前雇主那里学到了它更快,而Flash有很多这样的怪癖(我觉得很容易相信).

我只是想知道这些信息是否仍然是最新的(对于其他类似的Flash优化).根据我的经验,优化技巧在生活平台中相当快速地过时.

Chr*_*ris 2

我无法向您提供任何具体的硬数据,以确定哪个设置更快 - 设置为 null 或不设置为 null。老实说我不相信有人会。

我能做的就是为您提供一些有关垃圾收集的信息,您可以从中做出决定。

从 Flash Player 9 到 Flash Player 10 Adob​​e 做出了一些重大改进,特别是在内存管理方面。有几个“加载外部 swf”内存错误、未引用的声音残留等。其中大部分已得到纠正。

Grant Skinner 重点介绍了 GC 用于确定应删除哪些对象的技术。请参阅这个关于其工​​作原理的精彩演示(带有一些很酷的交互)http://gskinner.com/talks/resource-management/ (但请注意该演示是关于 FP9 的)

正如他所说,有引用计数和标记清除。AS3 中的 GC 最终归结为引用。如果一个对象(非原始类型)有对它的引用,则不会被删除,但如果没有,即无法访问它,它将被标记为删除。但您无法控制删除实际发生的时间 - 可能是这一帧,也可能是下一帧。

最终,在我看来,“清空”每个变量/属性(引用或其他)是浪费且非常难以管理的。对于较小的东西可能很实用,但是当对象变得更大并包含 100 个变量时,您无法一致地将所有变量都归零。

沿着这条轨道,Flash Player 只会以正确的方式优化其 GC,而不是相反。