浏览器的垃圾回收(Garbage Collection, GC)机制是前端性能优化和内存管理的重要基础。

一、垃圾回收的基本概念

  • 目的:自动回收不再使用的内存,避免内存泄漏,保证浏览器性能稳定。
  • GC 触发:当浏览器检测到内存不足或特定条件时,启动垃圾回收过程。

二、主要垃圾回收算法

1. 标记清除(Mark-and-Sweep)

  • 浏览器从**根对象(Global、执行上下文中的变量)**开始,标记所有可达对象。
  • 没被标记的对象被认为不可达,即不再被使用,进行回收。
  • 是现代 JS 引擎普遍采用的算法。

2. 引用计数(Reference Counting)

  • 每个对象维护引用计数,引用增加时计数+1,引用消失时计数-1。
  • 计数为 0 的对象立即回收。
  • 缺陷:无法处理循环引用,现代引擎一般不单独使用。

三、垃圾回收的触发时机

  • 内存分配达到一定阈值时自动触发。
  • 主动调用相关接口(如 Chrome DevTools 手动触发)。
  • 页面卸载时进行清理。

四、内存泄漏常见原因

  1. 全局变量未释放 全局变量一直被引用,无法回收。
  2. 闭包导致的变量无法释放 闭包作用域内变量被外部引用。
  3. 定时器未清除 setIntervalsetTimeout 未正确清除,导致引用保留。
  4. DOM 节点引用未释放 JS 中持有对已删除 DOM 的引用。
  5. 事件监听未移除 绑定事件后,未及时解绑,导致内存无法回收。

五、性能优化建议

  • 避免不必要的全局变量。
  • 使用完定时器及时清除。
  • 解绑不再使用的事件监听。
  • 谨慎使用闭包,避免无用变量持久存在。
  • 小心操作 DOM,及时释放引用。

常见考点

面试中考察点主要包括 GC 的原理、算法、触发时机、内存泄漏原因及避免方法:

  1. 浏览器垃圾回收的原理和常见算法?
  2. 标记清除与引用计数的区别与优缺点?
  3. 什么是内存泄漏?常见的内存泄漏类型?
  4. 如何避免内存泄漏?
  5. JS 引擎如何判断对象是否可回收?
  6. 浏览器中 GC 触发的时机?
  7. 如何用 Chrome DevTools 监测内存泄漏?
  8. 事件监听和闭包如何导致内存泄漏?