考虑这个 javascript 代码:
var s = "Some string";
s = "More string";
垃圾收集器 (GC) 在这种操作之后是否还有工作要做?
(我想知道在尝试最小化 GC 暂停时是否应该担心分配字符串文字。)
e: 让我觉得有点好笑的是,虽然我在问题中明确指出我需要尽量减少 GC,但每个人都认为我错了。如果真的必须知道特定的细节:我有一个 javascript 游戏——它在 Chrome 中运行良好,但在 Firefox 中有半频繁的暂停,这似乎是由于 GC。 (我什至检查过 Firefox 的 MemChaser 扩展,暂停与垃圾收集完全一致。)
最佳答案
是的,字符串需要进行垃圾回收,就像任何其他类型的动态分配对象一样。是的,这是一个合理的担忧,因为在繁忙的循环中粗心地分配对象肯定会导致性能问题。
但是,字符串值是不可变的(不可更改的),大多数现代 JavaScript 实现都使用“字符串驻留”,即它们只存储每个唯一字符串值的一个实例。这意味着如果你有这样的东西......
var s1 = "abc",
s2 = "abc";
...只会分配一个“abc”实例。这仅适用于字符串值,不适用于 String
对象。
有几点需要注意:
substring
、slice
等函数将为每个函数调用分配一个新对象(如果使用不同的参数调用)。即使两个变量都指向内存中的相同数据,但在 GC 循环运行时仍有两个变量需要处理。拥有太多局部变量也会对您造成伤害,因为它们中的每一个都需要由 GC 处理,从而增加开销。
一些关于编写高性能 JavaScript 的进一步阅读:
关于javascript - 分配一个新的字符串值会产生需要收集的垃圾吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13617005/