• 来源类型:对话助手输出(用户粘贴归档)
  • 整理日期:2026-05-14

摘要

说明 JavaScript 中垃圾回收的含义:引擎自动回收不再被引用的对象内存;以「可达性」从根(全局、调用栈、作用域等)判断保留与回收;对比引用计数与标记清除(现代引擎常用后者以处理循环引用);给出减少残留引用、清理定时器与监听器等实践提示;并说明 GC 时机由引擎决定、生产环境不宜依赖强制触发(调试工具除外)。

摘录要点

1. 什么是 JS 中的垃圾回收

  • 自动回收程序不再使用的内存;不像 C/C++ 需要手动 free
  • 引擎跟踪对象,当没有任何引用指向对象时,可释放其占用的内存。

2. 引擎如何判定「该收什么」

  • 可达性:仍能从根(全局变量、函数作用域、调用栈等)访问到的对象会被保留。
  • 不可达:没有任何引用链从根指向该对象 → 可作为垃圾回收。

示例(摘录):

let obj = { name: "Alice" };
obj = null; // 对象 { name: "Alice" } 变为不可达

3. 常见策略(教学向分类)

3.1 引用计数

  • 统计指向对象的引用数;为 0 时可回收。
  • 问题:循环引用会导致计数无法归零,对象可能长期无法释放。
let a = {};
let b = {};
a.ref = b;
b.ref = a;
// 若仅断开外部引用,两者仍互相指向,纯引用计数无法处理

3.2 标记清除(现代引擎常见表述)

  • 从根出发标记所有可达对象;未标记的视为垃圾并回收。
  • 可安全处理对象图中的环。

4. 如何「配合」GC(实践向)

  • 用完大对象后断开引用(如将大数组变量置为 null 或让变量离开作用域)。
  • 避免把临时大数据挂在全局上。
  • 清理定时器、事件监听器、以及闭包中对大对象的长期引用。

5. GC 何时运行

  • 由引擎调度,应用层无法可靠「强制」在生产环境触发;部分环境(如 Chrome DevTools)可提供调试用手动触发。

说明

以上为通俗教学整理,非引擎实现文档。具体引擎(如 V8)在标记清除之外还有分代收集、增量/并发标记等优化;见概念页 JavaScript 垃圾回收

另见(本库相近资料)


草稿整理:assistant(对话摘录归档),2026-05-14。