JavaScript垃圾回收核心是精准识别并释放不可达对象,采用分代回收(新生代复制算法、老生代标记-清除+整理)与标记-清除机制,开发者需通过解除引用、避免隐式全局、警惕闭包陷阱等配合GC。
JavaScript 的垃圾回收(GC)不是“要不要管”的问题,而是“怎么配合它才不拖后腿”的问题。它本质是引擎自动识别并释放那些程序再也访问不到的对象所占内存的过程——你不用手动 free,但写法不当,GC 也救不了你。
不是清空所有旧数据,而是精准定位“不可达对象”:即从全局对象、当前执行上下文、栈中变量等根(roots)出发,任何无法被递归访问到的对象,就被判定为垃圾。
引用计数曾被尝试,但因循环引用缺陷(如 obj1.ref = obj2; obj2.ref = obj1)已被主流引擎(V8、SpiderMonkey 等)弃用。现在统一采用基于可达性分析的标记-清除(Mark-and-Sweep):
V8 等引擎把堆分成新生代(Young Generation)和老生代(Old Generation),提升效率:
节奏GC 再智能,也依赖你的代码“释放线索”。关键动作很朴素:
timerId && clearTimeout(timerId)、element.removeEventListener、把缓存对象设为 null
let),函数内声明的变量尽量用 const/let,作用域结束即失活基本上就这些。机制本身透明,难点在于写出“让 GC 能一眼认出该收什么”的代码。