面试官 🤔:了解过浏览器的垃圾回收机制么……

70 阅读2分钟

Screen Recording 2024-07-07 at 17.51.17.gif

关于浏览器的垃圾回收,涉及很多的概念。我们通过一个对象的从生到死的过程来理解这些概念及其作用


代际假说

在V8引擎(用于Chrome和Node.js)中,采用的是分代垃圾回收策略。这种策略基于这样一个观察:大多数对象都是朝生夕死,只有少数对象会存活较长时间。

内存分为“新生区”(Young Generation)和“老生区”(Old Generation)

新生区

新生区用于存储生命周期较短的对象。这些对象通常在创建后很快就会被回收。

Scavenge 算法

新生区有两个空间(对象空间A & 空闲空间B)。新对象在新生区内的对象空间A创建,当对象空间A快满时,将其中的活跃数据复制到空闲空间B,并回收对象空间A中未被复制的数据

此时调换A/B的角色,B成为对象空间,A成为空闲空间,继续上述流程

晋升

新生区回收频率非常高,为了减少过程中的时间成本,所以新生区设置得比较小

对于经历了两次以上复制操作的对象数据,会把它移到老生区

老生区

老生区用于存储生命周期较长的对象。这些对象在新生区经过多次垃圾回收后仍然存活,被认为是长命的

标记-清除 算法

这是老生区回收过程中的一个常见策略

具体操作是:从一组根元素开始遍历,无法到达的元素就被认为是垃圾数据,可到达的数据则是活跃对象。将垃圾数据回收掉

整理阶段

在“标记-清除”执行完成之后,会出现很多不连续内存碎片,会导致大对象无法被分配到大块的连续内存。这时就会有一个整理的过程:让剩下的活跃对象紧密排列在一起

增量标记算法

垃圾回收的过程会暂停脚本的执行,导致“停顿”。为了减少停顿时间,增量标记算法将回收过程分割为多个小步骤,让回收过程与脚本的逻辑交替执行