我正在使用JS框架开发Android游戏。我想确保一旦完成使用它们就会收集一些垃圾。我该怎么强迫呢?我应该使用null还是undefined?
答案 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来简单地减少垃圾并提高性能。