简单总结v8浏览器的垃圾回收

68 阅读2分钟

垃圾回收涉及的面试题

参考文章:juejin.cn/post/686196…

非常言简意赅、易于理解且有一定深度

垃圾回收算法:

  1. 标记空间中的可达值
  2. 回收不可达的值所占据的内存
  3. 做内存整理

什么时候垃圾回收

浏览器将对象分为两类:临时对象、长久对象

V8又把堆分为两部分:新生代、老生代,分别对应浏览器的副垃圾回收器、主垃圾回收器

垃圾回收时会阻塞Javascript运行,造成页面卡顿,所以对于垃圾回收有以下几种收集方式:

  • 分代收集
  • 增量收集
  • 闲时收集

主垃圾回收器

负责老生代的垃圾回收,有两个特点:

  1. 对象占用空间大
  2. 对象存活时间长

使用【标记-清除】算法执行垃圾回收

可以进行碎片整理

副垃圾回收器

负责新生代的垃圾回收,通常只支持1~8M的容量

新生代分两个区域:From区 ( 对象区 ) 、To(空闲区)

当空闲区对象占用空间超过25%,直接晋升老生代;当对象多次复制后(两次垃圾回收)还是存在,移动到老生代(即对象晋升策略)

img

副垃圾回收器没有碎片整理,因为标记后存活的对象会被拷贝到空闲区,此时已经是有序的了

同时,这里面还提到一点,闭包实际上并不会造成内存泄漏,闭包里的变量就是需要用到的变量,而内存泄漏指的是不需要用到的变量仍然占据内存。之所以会造成这样的误解,是因为之前IE有bug,即使在使用完闭包也依然不会回收比闭包引用的变量。