返回

揭秘JS垃圾回收机制:掌控内存,提升性能

前端

今天,让我们来讨论JS垃圾回收机制的内部运作方式。在不久前,当提及JS垃圾回收时,我们停留在这个阶段:“不再需要的分配内存”。但这提出了一个问题:浏览器如何确定“不再需要的分配内存”?

MDN :像C这样的高级语言通常都有底层的内存管理接口,例如malloc()和free()。另一方面,JavaScript创建变量(对象,数组,函数,…)会分配内存,但不会释放内存。这基本上意味着JavaScript中的所有变量始终驻留在内存中,直到程序退出。

事情不应该以这种方式进行,对吧?内存泄漏显然是一个问题,而且JavaScript不应如此。这就是垃圾回收进入的地方。垃圾回收(GC)是一个自动化过程,负责在不再需要时释放内存。

深入探讨JS GC

JS GC是一个标记-清除算法。

标记阶段

在标记阶段,GC将遍历堆内存中的所有对象并标记可访问的对象。可访问意味着从根对象(全局对象,活动栈上的对象,DOM节点)可以访问该对象。

清除阶段

在清除阶段,GC将回收所有未标记的对象。这些未标记的对象不再可访问,因此可以安全地从内存中删除。

GC什么时候运行?

JS GC在空闲时间运行。这意味着它不会在事件处理程序或DOM操作期间运行。这有助于确保GC不会干扰应用程序的执行。

GC的优点

  • 自动内存管理: GC自动管理内存,因此您不必担心手动释放对象。
  • 防止内存泄漏: GC回收不再需要的对象,从而防止内存泄漏。
  • 提高性能: GC通过回收未使用的内存来提高性能。

GC的缺点

  • 暂停: GC会导致短暂的暂停,因为应用程序在GC运行时将被冻结。
  • 不可预测: 您无法控制GC的运行时间。

如何优化JS GC

  • 避免循环引用: 循环引用会阻止GC回收对象,因为它们仍然可访问。
  • 使用弱引用: 弱引用使GC可以回收即使仍然可访问的对象。
  • 优化对象创建和销毁: 减少创建和销毁对象的数量有助于GC更有效地工作。

了解JS GC对应用程序至关重要。通过理解其内部运作方式,您可以优化应用程序并避免GC问题。

本文参考: