前端里的增量回收本质就是垃圾回收的一种执行方式,他不是新的机制,而是让垃圾清除分多次、慢慢做,避免卡死页面
一、概念拆解
垃圾回收:回收不在使用的内存
垃圾清除算法:标记清除、引用计数
增量回收:一次做完or分批做
前端增量回收:浏览器js引擎里的GC优化手段
增量回收 = 垃圾清除的执行策略
二、如果没有增量回收
传统GC
JS 执行
↓
触发 GC
↓
暂停所有 JS(页面冻结)
↓
标记 + 清除
↓
继续执行
问题:
在threejs中如果没有增量GC,页面早卡死了
三、增量回收的思想
把一次完整的垃圾回收,拆成很多个小步骤,插在js执行的空隙中
类比:
一次性打扫房间:打扫期间只能打扫
碎片化时间打扫:每五分钟打扫一点,中途可随时停下,对生活影响极小
四、增量回收在 JS 引擎里是怎么做的?
1. 内存怎么分
新生代(Young Generation)
– 小对象
– 生命周期短
– 回收快(Minor GC)
老生代(Old Generation)
– 大对象
– 生命周期长
– 回收慢(Major GC)
👉 增量回收主要针对:老生代 GC
2. 标记清除 + 增量执行
传统标记清除
一次性:
标记所有可达对象
清除不可达对象
增量标记(Incremental Marking)
JS 执行一会儿
↓
标记一点对象
↓
JS 再执行
↓
再标记一点
↓
…
JS 和 GC 交替执行
3. JS 执行时对象不是在变吗
解决方案:写屏障(Write Barrier)
当 JS 代码:
obj.a = newObj
引擎会:
-
记录“对象引用发生了变化”
-
确保 GC 不会漏标对象
👉 这也是为什么你感觉不到 GC 在跑




