v8垃圾回收机制

新生代算法

scanvenge 算法 只是用一半的内存

scanvenge 算法 中的Cheney算法

Cheney算法 在 内存(堆) 中开辟两个空间 semispace空间 和 受限空间

semispace空间 成为 from space (存储原数据) 、受限空间 成为 to space(存储新数据)

将对比新旧dom树 将非重合资源找到

非重合资源(不可使用的失活资源)

重合的资源(可使用的存活资源)

重合的资源将由 from space 进入to space

然后 from space的资源 被回收

然后

清理后的空间 变为 semispace空间

tospace 变为 受限空间

循环 完成 垃圾回收

老生代算法

Mark-Sweep & Mark-Compact-针对于老生代

老生代不采用Scavenge算法原因

老生代中存活对象占比大,因此复制存活对象效率低。

浪费一半空间

Mark-Sweep标记清除

Mark-Sweep在标记阶段遍历堆中所有对象,并标记存活对象,在随后清除阶段中,只清除没有被标记的对象。**因为在老生代中死对象占据较小一部分,而Mark-Sweep只清除死亡对象,就像Scavenge算法,新生代中存活对象占小部分,其算法只处理存活对象,**这样效率就有了提升。

Mark-Sweep算法的缺点

该算法最大问题在于进行一次标记清除回收后**,内存空间会出现不连续的情况**。这种内存碎片会对后续的内存分配造成问题。因为很可能出现需要分配一个大对象的情况,而碎片空间无法完成分配,就会提前触发垃圾回收,而这次回收是不必要的。

Mark-Compact弥补Mark-Sweep碎片空间缺点

Mark-Compact是标记整理,该算法将存活对象往一端进行移动,移动完成后,直接清理掉最右边存活对象后面的内存区域完成回收。

缺点:速度慢-需要整理对象

优点:空间开销少

Incremental Marking-针对垃圾回收引起全停顿

为了避免JS应用逻辑和垃圾回收期看到的不一致,垃圾回收的3中基本算法都需要将逻辑暂停下来,等垃圾回收完成后再继续执行,这种行为被称为全停顿,在V8分代式垃圾回收中,一次小垃圾回收只收集新生代,由于新生代默认配置小,存活对象少,因此即使是全停顿也影响不大,而对于老生代通常配置大,存活对象多,全堆垃圾回收的标记、清理、整理等动作造成的停顿会比较可怕。

V8为了降低全堆垃圾回收带来的停顿时间,先从标记阶段入手将原本一口气停顿完成的动作改为增量标记,拆分许多小“步进”,每做完一“步进”就让JS应用逻辑执行一小会儿,垃圾回收和JS逻辑交替执行,直到标记阶段完成,V8经过标记改进后,垃圾回收的最大停顿时间减少到了原本的1/6.

V8后续还引进了延迟清理Lazy-Sweeping和增量式整理incremental Compaction,让清理与整理动作也变成增量式,同时还计划引入并行标记和并行清理,进一步利用多核性能降低每次停顿时间。

圾回收的最大停顿时间减少到了原本的1/6.

V8后续还引进了延迟清理Lazy-Sweeping和增量式整理incremental Compaction,让清理与整理动作也变成增量式,同时还计划引入并行标记和并行清理,进一步利用多核性能降低每次停顿时间。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑面饺子皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值