当前位置:  开发笔记 > 编程语言 > 正文

在AS3强制垃圾收集?

如何解决《在AS3强制垃圾收集?》经验,为你挑选了3个好方法。

是否可以以编程方式强制在ActionScript 3.0中强制执行完整的垃圾回收?

假设我已经使用eventListeners创建了一堆Display对象,并且已经删除了一些DO,一些eventListener已被触发和删除等等...有没有办法强制垃圾收集运行并收集所有内容可以收集吗?



1> davr..:

是的,这是可能的,但这通常是一个坏主意.GC应该更好地了解何时是一个比你应该运行的好时机,除了一个非常具体的情况,就像你刚刚使用500MB内存而你需要尽快恢复它,你不应该调用GC你自己.

在Flash 10中,有一种System.gc()方法可以调用(但请不要,请参见上文) - 请记住,System.gc()仅适用于Flash Player 10+的调试版本.

在Flash 9中,有一种不受支持的方式通过奇怪的LocalConnection命令强制它,但它可能不适用于所有版本.请参阅Grant Skinner的这篇文章.


这是一个很好的答案 - 但是错过了一个非常重要的观点.它无论如何只适用于调试播放器!System.gc() - 仅适用于Flash Player调试器版本和AIR应用程序.在AIR应用程序中,System.gc()方法仅在AIR Debug Launcher(ADL)中运行的内容中启用,或者在已安装的应用程序中,在应用程序安全沙箱中的内容中启用.[http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html#gc()]
在Flash 11中,有一个可以调用的`System.pauseForGCIfCollectionImminent()`方法.它需要一个参数,以便您可以让GC了解集合需要暂停的时间.有关更多详细信息/链接,请参阅下面的答案.

2> pnkfelix..:

有一个新的API告诉GC它可能是一个"相对好的时刻"来收集.

请参阅System.pauseForGCIfCollectionImminent的Adobe API文档

此方法在播放器版本11中引入后不久也发布了此Adobe博客文章

该方法采用"迫近"的论点; 基本上,如果你真的希望收集器运行,你输入一个较小的数字(接近0.0),即使自上次收集以来没有太多活动(目前用字节分配测量),你输入的数量很大(接近1.0)如果你只是想要收集暂停发生,如果我们已经接近集合将要发生的点.

这里的动机是针对例如游戏的情况,在这些情况下你想要将GC的发生点移动一点,例如在游戏中改变等级时进行GC,而不是在玩家开始探索关卡后两秒.

一个非常重要的细节:Release和Debugger Flash Runtimes都支持这个新的API.这使它优于调用System.gc().



3> Marc Hughes..:

对于所有当前发布的版本,System.gc()仅适用于Flash播放器和ADL(AIR应用程序的调试环境)的调试版本.Flash播放器10 beta目前可以用于各种风格.

我同意戴尔的观点,这是一个坏主意.运行时通常比你有更好的想法.

此外,垃圾收集器如何工作的细节是一个实现细节,可能会在Flash播放器版本之间发生变化.所以今天运作良好并不能保证将来能够很好地运作.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有