Appearance
浏览器垃圾回收
机制
- 标记清除算法
- 标记阶段,从window根对象触发 -> 可达镀锡
- 清除阶段,对未标记的对象进行销毁清除 解决内存泄漏的问题:
- 未解绑的事件监听
- 闭包中引用的外部变量
- 意外的全局变量
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制。因此,V8 将内存(堆)分为新生代和老生代两部分。
(1)新生代算法
新生代中的对象一般存活时间较短,使用 Scavenge GC 算法。
在新生代空间中,内存空间分为两部分,分别为 From 空间和 To 空间。在这两个空间中,必定有一个空间是使用的,另一个空间是空闲的。新分配的对象会被放入 From 空间中,当 From 空间被占满时,新生代 GC 就会启动了。算法会检查 From 空间中存活的对象并复制到 To 空间中,如果有失活的对象就会销毁。当复制完成后将 From 空间和 To 空间互换,这样 GC 就结束了。
(2)老生代算法
老生代中的对象一般存活时间较长且数量也多,使用了两个算法,分别是标记清除算法和标记压缩算法。
先来说下什么情况下对象会出现在老生代空间中:
- 新生代中的对象是否已经经历过一次 Scavenge 算法,如果经历过的话,会将对象从新生代空间移到老生代空间中。
- To 空间的对象占比大小超过 25 %。在这种情况下,为了不影响到内存分配,会将对象从新生代空间移到老生代空间中。
标记-清除(Mark and Sweep):这是一种更复杂的垃圾回收策略,它将内存中的所有对象分为“可达”和“不可达”两组。垃圾回收器首先标记所有可达对象,然后清除所有不可达对象。这个过程涉及两个阶段:标记阶段和清除阶段。
- 标记阶段:从根对象开始,垃圾回收器递归遍历所有对象,并标记为可达的对象。
- 清除阶段:垃圾回收器清除所有未标记的对象,即不可达对象。