V8的垃圾回收机制

81 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

V8 的内存分代

V8 中,主要将内存分为新生代老生代两代。

新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或者常驻内存的对象。

新生代区域:

  • 大部分对象在内存中存活的时间很短。
  • 比如函数内部声明的变量,或者块级作用域中的变量。当函数或者代码块执行结束时,作用域中定义的变量就会被销毁。
  • 这类对象很快就变得不可访问,应该快点回收。

老生代区域:

  • 生命周期很长的对象,比如全局的 window、DOM、Web API 等等。
  • 这类对象可以慢点回收。

垃圾回收算法

  • 标记空间中可达值
    • 从根节点(Root)出发,遍历所有的对象。
    • 可以遍历到的对象,是可达的(reachable)。
    • 没有被遍历到的对象,不可达的(unreachable)
  • 回收「不可达」的值所占据的内存
  • 内存整理

分代收集

主垃圾回收器负责 老生代 的垃圾回收,副垃圾回收器负责新生代 的垃圾回收。

主垃圾回收器

它使用标记-清除的算法执行垃圾回收。

  1. 标记
  • 从一组根元素开始,递归遍历这组根元素。
  • 在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据
  1. 直接将标记为垃圾的数据清理掉
  2. 多次标记-清除后,会产生大量不连续的内存碎片,需要进行内存整理

副垃圾回收器

采用复制的方式实现垃圾回收算法。它将堆内存一分为二。

新生代分为两部分:From空间使用中状态)和 To空间空闲状态)。

  1. 检查From空间 中的存活对象,存活对象被复制到To空间 中,非存活对象占用的空间将会被释放。
  2. 复制完成后,From空间To空间 的角色发生兑换。

简而言之,在垃圾回收的过程中,就是通过将存活对象的在两个空间之间进行复制。

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏。