返回
揭秘JS垃圾回收机制:掌控内存,提升性能
前端
2023-09-13 08:35:24
今天,让我们来讨论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问题。
本文参考: