AS3中的垃圾回收是如何工作的?

3

我知道没有被引用的对象会被垃圾回收,所以在使用完对象后,我一直在确保将其引用设置为null。我想知道以下几点:

  1. 只有对象需要设置为null吗?Number、int、String等可以不设置为null,对吗?这方面有最佳实践吗?

  2. 垃圾回收通常运行多久一次?它是否倾向于在处理器需求较低时运行?

  3. 是否有一种方法可以手动告诉垃圾回收运行,例如当我完成一个充满精灵的游戏场地时?如果垃圾回收倾向于在处理器使用率低时运行,那么我并不真正需要这样做,因为它将在我希望它运行的时间自动运行。

  4. 仅用于if或for语句范围内的对象(除非它们被分配给其他引用),都可以进行垃圾回收,对吗?


关于第四点的提醒:在ActionScript中没有块级作用域,只有“局部”和“全局”。在“for”或“if”中定义的任何变量通常属于其函数,并且在函数完成之前不会超出范围。此外,闭包使作用域保持活动状态的时间比您想象的要长。 - J. Holmes
1个回答

5

gskinner有一篇关于Flash Player中GC的好文章

  1. 只有使用new运算符创建的对象才应该被设置为null引用,花括号操作符 ({x:5, y:5}) 和 中括号操作符 ([1,2,3]) 不需要被设置为null引用。
  2. 垃圾回收器使用一组启发式规则来查看RAM分配和内存堆栈的大小等因素,以确定何时运行。
  3. 您可以在FP10中使用System.gc()手动运行它,但它仅在调试播放器中有效。
  4. 是的,没错。

  1. 这让我非常清楚 - 任何我使用 "new" 的东西,我需要稍后设置为 null。太棒了!
  2. 这是否意味着它通常只在内存开始变满时运行,还是当处理器需求较低时也会运行?我认为我主要关心垃圾收集的标记扫描部分。
- Martin
1
当您的应用程序填充应用程序实例的分配内存时,GC会被触发。它不取决于处理器需求。 - zaynyatyi
真遗憾。我很想在我知道程序不会做太多事情的时候触发(甚至请求)垃圾回收。我想这只能由我来确保未使用的项目被断开连接或回收利用了。感谢您的帮助! - Martin
在Flash 11中,你可以给系统一个提示,告诉它现在是进行垃圾回收的好时机:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/System.html#pauseForGCIfCollectionImminent%28%29 - Joe Ward
修正你的答案:只有通过 new 操作符、花括号操作符({x:5, y:5})和方括号操作符([1,2,3])创建的对象才能被空引用。 - Robin Rodricks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接