如果你想在Javascript中对变量强制垃圾收集,那么将它设置为null还是undefined更好?

时间:2013-07-04 22:07:25

标签: javascript performance

我正在使用JS框架开发Android游戏。我想确保一旦完成使用它们就会收集一些垃圾。我该怎么强迫呢?我应该使用null还是undefined?

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

您可以将其设置为null,如果那是对该对象的最后一次引用,它将有资格进行垃圾回收。

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

TGH的建议是最好的,但我建议这样做。

答案 3 :(得分:1)

  

如果你想在Javascript中对变量强制垃圾收集,最好将其设置为null或undefined?

无关紧要,您甚至可以将其设置为创建的另一个对象:只要变量最初引用的对象不再被引用,就可以进行垃圾回收。将您的对象视为"变量引用的内容"。

如果没有变量引用它,它可以被垃圾收集,并且"将另一个对象放入变量"将使变量不再引用前一个对象。

  

我想确保一旦完成使用它们就会收集一些垃圾。我如何强制呢?

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

global.gc();

如果你的应用/游戏是基于浏览器的,那么在Chrome中你只能使用--allow-natives-syntax开关(你的用户需要自己将其传递给Chrome),并致电:

%CollectGarbage();

注意:死得很简单,但是如果你可以轻松地从你离开的地方继续(例如将游戏重新加载到另一个级别,如果你愿意的话)你也可以做一个window.location.reload()作为后备)。

但是,请记住,如果收集到大量垃圾,这些调用将无法解决,并且可以阻止整个。如果您确定了游戏中的暂停状态,例如在关卡之间加载屏幕,这可能是理想的选择,但在其他情况下却很棘手。

您可能还想考虑在使用或不使用手动垃圾收集的情况下使用object pool来简单地减少垃圾并提高性能。