如何在JavaScript中触发垃圾收集?

时间:2015-05-14 17:18:38

标签: javascript memory-management garbage-collection

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

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

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

更新 Javascript and Garbage collection不解释事件的顺序及其触发方式。我不想控制垃圾收集。我需要更好的理解来设计更好的代码。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

可以通过多种方式触发GC

  • 分配触发:分配缓冲区/年轻代/不再需要更多空间,并且需要GC来释放对象
    这在混合GC /手动分配环境中变得有点复杂。 malloc包装器可能也需要触发GC,因为javascript可以保存到手动分配的资源。
  • [在浏览器中]当一个标签/窗口被关闭/替换时,假设此时有很多易于收集的垃圾
  • 由增量收集的启发式时间触发以满足暂停时间目标
  • 特权javascript可能能够直接触发集合
  • 作为各种非GC管理组件的最后努力,如果它们耗尽本机资源(文件句柄,虚拟地址空间),希望等待最终确定的GC对象持有它们

我可能还有其他原因可以想到。它通常不是你应该关注的事情。

如果您想保持GC较低,则需要保持较低的对象分配率。例如。某些算法可以从预先分配的缓冲区中受益,它们可以在其上执行工作。该策略的有效性取决于javascript运行时是否具有转义分析以及它首先避免短期分配的有效性。关于收藏家是否是世代的。世代收藏家因快速,短暂的分配而受到的影响要小得多。