2026-05-14 来源:对话摘录——JavaScript 垃圾回收(GC)入门说明
- 来源类型:对话助手输出(用户粘贴归档)
- 整理日期:2026-05-14
摘要
说明 JavaScript 中垃圾回收的含义:引擎自动回收不再被引用的对象内存;以「可达性」从根(全局、调用栈、作用域等)判断保留与回收;对比引用计数与标记清除(现代引擎常用后者以处理循环引用);给出减少残留引用、清理定时器与监听器等实践提示;并说明 GC 时机由引擎决定、生产环境不宜依赖强制触发(调试工具除外)。
摘录要点
1. 什么是 JS 中的垃圾回收
- 自动回收程序不再使用的内存;不像 C/C++ 需要手动
free。 - 引擎跟踪对象,当没有任何引用指向对象时,可释放其占用的内存。
2. 引擎如何判定「该收什么」
- 可达性:仍能从根(全局变量、函数作用域、调用栈等)访问到的对象会被保留。
- 不可达:没有任何引用链从根指向该对象 → 可作为垃圾回收。
示例(摘录):
let obj = { name: "Alice" }; |
3. 常见策略(教学向分类)
3.1 引用计数
- 统计指向对象的引用数;为 0 时可回收。
- 问题:循环引用会导致计数无法归零,对象可能长期无法释放。
let a = {}; |
3.2 标记清除(现代引擎常见表述)
- 从根出发标记所有可达对象;未标记的视为垃圾并回收。
- 可安全处理对象图中的环。
4. 如何「配合」GC(实践向)
- 用完大对象后断开引用(如将大数组变量置为
null或让变量离开作用域)。 - 避免把临时大数据挂在全局上。
- 清理定时器、事件监听器、以及闭包中对大对象的长期引用。
5. GC 何时运行
- 由引擎调度,应用层无法可靠「强制」在生产环境触发;部分环境(如 Chrome DevTools)可提供调试用手动触发。
说明
以上为通俗教学整理,非引擎实现文档。具体引擎(如 V8)在标记清除之外还有分代收集、增量/并发标记等优化;见概念页 JavaScript 垃圾回收。
另见(本库相近资料)
- JavaScript 在 V8 引擎浏览器上是怎么执行的(执行模型与事件循环)
- JavaScript基础 —— 基本数据类型与引用类型的异同(引用与对象生命周期直觉)
草稿整理:assistant(对话摘录归档),2026-05-14。