我目前正在使用Javascript开发一款游戏。经过一些测试,我开始注意到偶尔出现的延迟,只能是由GC引起的。我决定对其进行分析。结果显示,GC实际上是罪魁祸首:
我读到创建新对象会引起很多GC。我想知道像这样的代码:
var x = [];
由于Java中的原始类型不会创建垃圾,因此它也会创建任何垃圾。由于JavaScript中没有真正的类型,我不确定。此外,哪种方法可以创建最少的垃圾:
选项1:
function do() {
var x = [];
...
}
选项2:
var x = [];
function do() {
x = [];
...
}
选项3:
function do() {
x = [];
...
}
或者选项4:
function do() {
var x = [];
...
delete x;
}
选项5:
var x = [];
function do() {
x.length = 0;
...
}
在我的情况下,do函数每秒被调用30次。它对数组执行多个操作。
我想知道这个问题的答案,因为我刚刚将所有变量都设置为全局变量,以尝试防止它们被GC收集,但是GC并没有改变太多。
您能否提供一些常见的创建大量垃圾的事物和一些替代方案的示例。
谢谢。
delete
的选项4中,不起作用,因为delete
不会销毁对象。选项2和3执行完全不同的操作,您几乎不需要那样做 - 全局变量是反模式。 - Bergido
。这些“模式”过于通用,无法对它们的GC行为提供任何有用的信息。do
是否经常被执行或者是否在热路径上?在计算出x
后,还有其他地方/方式在哪里使用了它?目前很可能会受到死代码消除的影响,唯一的分配是为do
函数对象和可能的x
全局变量。 - Bergi