垃圾回收靠标记-清除算法判断对象是否该被清理:从根对象出发递归标记可达对象,未标记的即为不可达垃圾;引用计数法因无法处理循环引用而被淘汰。

JavaScript内存管理由引擎自动完成,开发者不需手动分配或释放内存。核心在于垃圾回收器(GC)周期性识别并清理“不可达对象”,防止内存泄漏。它不是实时运行,而是在内存压力增大、空闲时段或执行上下文切换时触发。
垃圾回收靠什么判断一个对象该被清理?
现代引擎(如V8)主要用标记-清除(Mark-and-Sweep)算法,不依赖引用计数:
- 从一组“根对象”出发(如全局对象、当前执行上下文中的变量、栈中活跃引用),递归遍历所有可达对象,并打上“存活”标记
- 遍历完成后,未被标记的对象即为“不可达”,被视为垃圾,所占堆内存被统一回收
- 这种机制天然解决循环引用问题——即使
obj1.ref = obj2且obj2.ref = obj1,只要二者都脱离全局或任何活动上下文,它们都不会被根可达,仍会被回收
为什么早期的引用计数法被淘汰了?
引用计数曾用于部分旧浏览器(如IE6–8),但存在根本缺陷:
- 每个对象维护一个计数器,每次新增引用+1,解除引用−1
- 一旦两个对象互相引用(
a.b = b; b.a = a),它们的计数永远≥1,即使外部已无任何引用,也无法归零 - 这会导致内存持续占用,形成隐性泄漏,尤其在DOM与JS对象交叉引用时高发(如
element.obj = myObj; myObj.el = element)
哪些操作容易干扰垃圾回收?
虽然GC自动运行,但代码写法会影响对象是否及时变为“不可达”:
标签: javascript java js 处理器 浏览器 栈 win 作用域 垃圾回收器 为什么
还木有评论哦,快来抢沙发吧~