# V8垃圾回收机制
# 开始前的名词解释环节
# 代际假说和分代收集
首先明确一点
代际假说是一个非常关键的概念 它是垃圾回收策略的相关基础代际假说有两个特点- 大部分对象在内存中的存活时间非常短 简单来说就是 对象一经内存分配 很快就会无法访问
- 可以持续访问的对象(不死的对象) 存活时间较长
口头描述是不是感觉比较生涩难以理解 但是没关系 我们先记住这两个特点 并且我们基于这两个特点 来一起看看 V8是如何实现垃圾回收机制的
新生代和老生代- 新生代 用于存放在内存中存活时间比较短的对象
- 老生代 用于存放在内存中存活时间比较长的对象
- 同时 V8基于
新生代对应一个副垃圾回收器而老生代对应一个主垃圾回收器
- 同时 V8基于
垃圾回收的执行流程
不论主垃圾回收器还是副垃圾回收器 他们都有一个
统一的执行过程- 标记
活动对象和非活动对象前者的名词解释其实就是还在使用的对象后者的名词解释就是可以进行垃圾回收的对象
- 标记
- 对于
非活动对象所占据对内存 进行一次回收 (垃圾清理)
- 对于
- 内存整理 我们都知道内存是一块
连续的分配空间当多次进行垃圾回收以后 这块连续的内存空间会被变得不连续 那么就会产生内存碎片不过这一步并不是必须的 同时在上文提到的副垃圾回收器并不会产生内存碎片
- 内存整理 我们都知道内存是一块
有了上述的名词解释基础以后 我们一起来看看副垃圾回收器是如何工作的吧
# 副垃圾回收器工作流(scavenge算法)
基于
scavenge算法副垃圾回收器把新生区对半分为了对象空间和空闲空间而所有的新对象都会被添加到对象空间里 同时 当对象空间快被填满的时候就会触发垃圾回收的前置条件# 回收过程
- 标记活动对象和非活动对象
活动对象复制到空闲区域中 同时有序排列所有的存活对象 这里的有序排列正好解释了为什么副垃圾回收器不会产生内存碎片
(一块连续的内存空间被分割以后就会产生内存碎片 而副垃圾回收器在复制完活动对象以后 对所有的对象进行了一次排序 那么内存会重新归于连续状态)
- 对
空闲区域和对象区域做一次角色翻转 也就是两者角色兑换 也正是因为这个机制 在新生区中 这两个区域可以无限次使用脑补一下翻转过程 翻转以后此时的空闲区域被非活动对象填充对象区域仅剩下活动对象所以 也就完成了垃圾回收
- 对
- 翻转以后即完成垃圾回收
具体的回收过程 可以参考下图
