JavaScript 中的垃圾收集是如何触发的?

How is garbage collection triggered in JavaScript?

考虑下面的 JavaScript 代码。我正在创建比方说 4 个元素的数组,然后立即删除对它的引用。什么时候会进行垃圾收集?我知道它特定于语言实现,但我们没有那么多 JavaScript 引擎。

编辑:这是最简单的情况,但我很感兴趣,因为垃圾收集会在某些网络音频应用程序中引起可听见的故障。

var a = [1, 2, 3, 4];
a = null;
// other code

更新: Javascript and Garbage collection 没有解释事件的顺序以及它是如何触发的。我不想控制垃圾收集。我需要更好的理解才能设计出更好的代码。

删除不再使用的对象的引用是一个好方法。许多(几乎所有)javascript 引擎使用 标记和扫描 方法。如果您要删除对某个对象的引用并且它没有其他引用,则它可能会在下一个标记和扫描周期中被收集。

垃圾收集是一种循环方法,在少数引擎中定期发生。一些引擎说他们以有效的方式进行 GC,但是没有可用的有效文档。

GC 的触发方式有很多种

  • allocation-triggering:分配中没有更多空间buffers/young generation/howeveritiscalled,需要GC释放objects
    这得到在混合 GC/manual 分配环境中有点复杂。 malloc 包装器可能也需要触发 GC,因为 javascript 可以保留手动分配的资源。
  • [在浏览器中]当 tab/window 得到 closed/replaced 时,假设此时有很多 easy-to-collect 垃圾
  • time-triggered 通过增量启发式 collections 来满足停顿时间目标
  • 特权javascript也许可以直接触发collections
  • 作为 last-ditch 各种 non-GC-managed 组件的努力,如果它们 运行 超出本机资源(文件句柄,虚拟地址 space),希望 GC object 正在等待最终确定

可能还有其他我目前能想到的原因。这通常不是您应该关心的事情。

如果您想保持较低的 GC,您需要保持较低的 object 分配率。例如。一些算法可以从 pre-allocated 缓冲区中获益,它们在这些缓冲区上执行工作。该策略的有效性取决于 javascript 运行 时间是否进行了逃逸分析,以及它在首先避免 short-lived 分配方面的有效性。以及收藏家是否是世代相传的。分代收集器受快速 short-lived 分配的影响要小得多。