JavaScript引擎V8中的垃圾回收机制

2020-12-13  本文已影响0人  顽皮的雪狐七七

目录

认识V8

V8垃圾回收策略

程序的使用过程中,可以分为 原始类型数据对象类型数据

原始数据都是由程序语言自身控制的,这里的回收还是指主要存活在堆区的对象数据,这个过程是离不开内存操作的,V8也是对内存做了上限,那在这种情况下是如何对垃圾进行回收的?

所以V8中会用到更多的GC算法,这里对GC算法不懂的还有这篇文章中说到的标记清除、整理等算法详细介绍在这篇文章中,此文章不再进行赘述

GC —— 垃圾回收机制认识与算法详解

V8常用的GC算法

V8的分代回收

V8的内存分配

V8内存空间一分为二,分为新生代存储区和老生代存储区,如图:

image

新生代对象回收

主要使用算法

采用赋值算法 + 标记整理算法

回收过程

新生代内存区分为两个等大小空间,使用空间为From,空闲空间为To

如果需要申请空间使用,回收步骤如下:

  1. 首先会将所有活动对象存储于From空间,这个过程中To是空闲状态。
  2. From空间使用到一定程度之后就会触发GC操作,这个时候会进行标记整理对活动对象进行标记并移动位置将使用空间变得连续,便于后续不会产生碎片化空间。
  3. 将活动对象拷贝至To空间,拷贝完成之后活动空间就有了备份,这个时候就可以考虑回收操作了。
  4. From空间完成释放,回收完成
  5. FromTo名称进行调换,继续重复之前的操作。

总结就是:
使用From -> 触发GC标记整理 -> 拷贝到To -> 回收From -> 名称互换重复之前

晋升

拷贝的过程中某个对象的指代在老生代空间,就可能出现晋升。 晋升就是将新生代对象移动至老生代。

什么时候触发晋升操作?

  1. 一轮GC之后还存活的新生代对象需要晋升
  2. 在拷贝过程中,To空间的使用率超过25%,将这次的活动对象都移动至老生代空间

为什么是限制To的使用率呢?

将来回收操作是要把From空间的内容拷贝到To空间中进行交换,如果To的使用率太高,变成From之后新的对象就存不进去了。

回收老生代对象

主要使用算法

主要采用标记清除 (首要) 、标记整理、增量标记算法

之前标记清除和整理的原理都在GC那篇文章中解释,这里就详情看看增量标记是如何工作的?

标记增量如何优化垃圾回收?

看图可以将垃圾回收分成两个部分,一个是程序的执行,一个是垃圾的回收。当垃圾回收的时候其实会阻塞程序的执行,所以中间会有空档期。

image

新生代 VS 老生代

上一篇下一篇

猜你喜欢

热点阅读