// in a garbage collected VM, destroy someObject:
someObject.a = null;
someObject.b = null;
someObject = null;
我听说在像 Java 或 C# 这样的好 VM 中,你不应该这样做。设置
someObject
的 a
和 b
至 null
会减慢垃圾回收的速度,因为 GC 需要更长的时间才能发现对象 a
和 b
之前提到的不再被引用,而如果你保持它们完好无损,GC 将在清理时立即检查它们 someObject
.假设我听到的是真的(如果不是,请纠正我),AVM2,ActionScript 3 VM(特别是在最新版本的 Flash Player 中)是否相同?
我问的原因是我有一个同事这样做,因为他从以前的雇主那里了解到它更快,而且 Flash 有很多这样的怪癖(我觉得很容易相信)。
我只是想知道该信息是否仍然是最新的(对于其他类似的 Flash 优化也是如此)。根据我的经验,像这样的优化技巧在活平台上很快就会过时。
最佳答案
我无法为您提供任何更快的特定硬数据 - 设置为 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,而不是相反。
关于flash - 在要进行 GC 的对象中将引用设置为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5372216/