10

我正在使用 JS 框架开发 Android 游戏。我想确保某些对象在我用完它们后被垃圾回收。我该如何强制?我应该使用 null 还是 undefined?

4

4 回答 4

9

你不能强制垃圾收集(不是以任何理智的方式)。

如果您的变量没有自动超出范围,只需将它们设置为null.

于 2013-07-04T22:09:15.670 回答
9

最好的建议是在使它们有资格进行垃圾收集的范围内定义它们。这意味着不要使用永远不符合收集条件的全局变量。而是将它们声明为本地人。

于 2013-07-04T22:09:57.637 回答
5

您可以将其设置为 null,如果那是对该对象的最后一个引用,它将成为垃圾回收的条件。

http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/

不过,TGH 的建议是最好的,我会推荐。

于 2013-07-04T22:11:51.617 回答
3

如果您想对 Javascript 中的变量强制进行垃圾回收,最好将其设置为 null 还是 undefined?

没关系,您甚至可以将其设置为创建的另一个对象:只要该变量最初引用的对象不再在任何地方引用,就可以进行垃圾回收。把你的对象想象成“被变量引用的东西”。

如果没有变量引用它,它可以被垃圾回收,并且“将另一个对象放入变量中”将使该变量不再引用之前的对象。


我想确保某些对象在我用完它们后被垃圾回收。我该如何强制

您可以强制在基于节点的运行时(例如 Electron 或 NW.js)中触发主要垃圾收集,方法是使用--expose-gc标志并运行:

global.gc();

如果您的应用/游戏是基于浏览器的,则只有在 Chrome 中您可以使用该--allow-natives-syntax开关(您的用户需要自己将其传递给 Chrome),然后调用:

%CollectGarbage();

window.location.reload()注意:非常简单,但如果您可以轻松地从上次中断的地方继续(例如,如果您愿意,将游戏重新加载到另一个级别),您也可以只做一个后备。

但是请记住,这些调用不会乱来,如果要收集大量垃圾,它们可能会阻塞整整几秒钟。如果您在游戏中确定了暂停,例如在关卡之间加载屏幕,这可能是理想的,但否则会很棘手。

您可能还想考虑使用对象池,无论是否使用手动垃圾收集,以简单地减少垃圾并提高性能。

于 2018-04-16T11:40:40.777 回答