小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
V8 的内存分代
在 V8 中,主要将内存分为新生代和老生代两代。
新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或者常驻内存的对象。
新生代区域:
- 大部分对象在内存中存活的时间很短。
- 比如函数内部声明的变量,或者块级作用域中的变量。当函数或者代码块执行结束时,作用域中定义的变量就会被销毁。
- 这类对象很快就变得不可访问,应该快点回收。
老生代区域:
- 生命周期很长的对象,比如全局的
window、DOM、Web API等等。 - 这类对象可以慢点回收。
垃圾回收算法
- 标记空间中可达值
- 从根节点(Root)出发,遍历所有的对象。
- 可以遍历到的对象,是可达的(reachable)。
- 没有被遍历到的对象,不可达的(unreachable)
- 回收「不可达」的值所占据的内存
- 内存整理
分代收集
主垃圾回收器负责 老生代 的垃圾回收,副垃圾回收器负责新生代 的垃圾回收。
主垃圾回收器
它使用标记-清除的算法执行垃圾回收。
- 标记
- 从一组根元素开始,递归遍历这组根元素。
- 在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据
- 直接将标记为垃圾的数据清理掉
- 多次标记-清除后,会产生大量不连续的内存碎片,需要进行内存整理
副垃圾回收器
采用复制的方式实现垃圾回收算法。它将堆内存一分为二。
新生代分为两部分:From空间(使用中状态)和 To空间(空闲状态)。
- 检查
From空间中的存活对象,存活对象被复制到To空间中,非存活对象占用的空间将会被释放。 - 复制完成后,
From空间和To空间的角色发生兑换。
简而言之,在垃圾回收的过程中,就是通过将存活对象的在两个空间之间进行复制。
结语
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。
文章如有错误之处,希望在评论区指正🙏🙏。