// 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优化)。根据我的经验,这样的优化技巧在生活平台上会很快过时。
答案 0 :(得分:2)
我无法为您提供更快速的特定硬数据 - 设置为null或不是。老实说,我不相信任何人会。
我能做的最好的事情是为您提供有关垃圾收集的一些信息,您可以从那里做出决定。
从Flash Player 9到Flash Player 10 Adobe已经做出了一些重大改进,特别是在内存管理方面。有几个'加载外部swf'的内存错误,未引用的声音粘在一起,等等大多数已被纠正。
Grant Skinner强调了GC用于确定应删除哪些对象的技术。看看这个优秀的演示文稿(有一些很酷的互动)如何工作http://gskinner.com/talks/resource-management/(但请注意演示文稿是关于FP9)
他说有参考计数和马克清扫。最终,AS3中的GC归结为参考。如果一个对象(非初始类型)具有对它的引用将不会被删除,但如果它没有被删除,即没有办法访问它,它将被标记为删除。但你无法控制删除实际发生的时间 - 可能是这个框架,可能是下一个框架。
最终,在我看来,'无效'每个变量/属性(参考或其他)都是浪费且非常难以处理的。对于较小的东西可能是实用的,但是当对象变得越来越大时,100个变量,你不能一致地将所有变量都归零。
沿着轨道向前播放Flash Player只会优化他们的GC以正确的做事方式,而不是相反。