是否可以以编程方式强制在ActionScript 3.0中强制执行完整的垃圾回收?
假设我已经使用eventListeners创建了一堆Display对象,并且已经删除了一些DO,一些eventListener已被触发和删除等等...有没有办法强制垃圾收集运行并收集所有内容可以收集吗?
是的,这是可能的,但这通常是一个坏主意.GC应该更好地了解何时是一个比你应该运行的好时机,除了一个非常具体的情况,就像你刚刚使用500MB内存而你需要尽快恢复它,你不应该调用GC你自己.
在Flash 10中,有一种System.gc()
方法可以调用(但请不要,请参见上文) - 请记住,System.gc()仅适用于Flash Player 10+的调试版本.
在Flash 9中,有一种不受支持的方式通过奇怪的LocalConnection命令强制它,但它可能不适用于所有版本.请参阅Grant Skinner的这篇文章.
有一个新的API告诉GC它可能是一个"相对好的时刻"来收集.
请参阅System.pauseForGCIfCollectionImminent的Adobe API文档
此方法在播放器版本11中引入后不久也发布了此Adobe博客文章
该方法采用"迫近"的论点; 基本上,如果你真的希望收集器运行,你输入一个较小的数字(接近0.0),即使自上次收集以来没有太多活动(目前用字节分配测量),你输入的数量很大(接近1.0)如果你只是想要收集暂停发生,如果我们已经接近集合将要发生的点.
这里的动机是针对例如游戏的情况,在这些情况下你想要将GC的发生点移动一点,例如在游戏中改变等级时进行GC,而不是在玩家开始探索关卡后两秒.
一个非常重要的细节:Release和Debugger Flash Runtimes都支持这个新的API.这使它优于调用System.gc().
对于所有当前发布的版本,System.gc()仅适用于Flash播放器和ADL(AIR应用程序的调试环境)的调试版本.Flash播放器10 beta目前可以用于各种风格.
我同意戴尔的观点,这是一个坏主意.运行时通常比你有更好的想法.
此外,垃圾收集器如何工作的细节是一个实现细节,可能会在Flash播放器版本之间发生变化.所以今天运作良好并不能保证将来能够很好地运作.