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

时间:2011-03-20 23:09:38

标签: flash actionscript-3 garbage-collection jvm clr

// in a garbage collected VM, destroy someObject:
someObject.a = null;
someObject.b = null;
someObject = null;

我听说在像Java或C#这样的好的虚拟机中,你不应该这样做。将someObject的{​​{1}}和a设置为b会减慢垃圾收集速度,因为GC需要更长时间才能找到对象null和{{1之前提到的不再被引用,而如果你保持完整,GC会在清理a时立即检查它们。

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

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

我只是想知道这些信息是否仍然是最新的(对于其他类似的Flash优化)。根据我的经验,这样的优化技巧在生活平台上会很快过时。

1 个答案:

答案 0 :(得分:2)

我无法为您提供更快速的特定硬数据 - 设置为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以正确的做事方式,而不是相反。