V8垃圾回收机制

V8是一款开源的JavaScript引擎,由Google开发。

V8是Chrome浏览器的核心组件之一,并且被许多Node.js应用程序使用。V8引擎具有内置的垃圾回收机制,用于自动管理JavaScript程序中的内存分配和释放。

一、V8 的内存结构

V8 的内存主要分为堆内存和栈内存。栈内存主要用于存储局部变量和函数调用信息等,当函数执行完毕后,栈内存会自动释放。而堆内存则用于存储动态分配的对象,如 JavaScript 对象等,这部分内存的管理主要由垃圾回收机制负责。

如下图所示:

内存用途类型
栈内存存储局部变量和函数调用信息
堆内存存储动态分配的对象

二、V8 的垃圾回收算法

分代回收:

V8 将堆内存分为新生代和老生代两个区域。新生代通常存储生存时间较短的对象,老生代则存储生存时间较长的对象。

新生代采用 Scavenge 算法,主要是将内存空间一分为二,分别称为 From 空间和 To 空间。新创建的对象首先分配在 From 空间,当 From 空间满了之后,就会触发一次垃圾回收操作。在回收过程中,存活的对象被复制到 To 空间,然后清空 From 空间。下次垃圾回收时,From 空间和 To 空间角色互换。当一个对象经过多次复制后依然存活,它就会被晋升到老生代。

老生代采用 Mark-Sweep(标记清除)和 Mark-Compact(标记整理)算法。Mark-Sweep 算法首先标记出所有存活的对象,然后清除未被标记的对象。但是这种算法会产生内存碎片,因此在必要的时候会采用 Mark-Compact 算法进行整理,将存活的对象移动到一端,释放出连续的内存空间。

如下图所示:

堆内存区域算法说明
新生代Scavenge 算法From、To 空间相互复制存活对象,多次存活晋升老生代
老生代Mark-Sweep 和 Mark-Compact 算法标记清除未标记对象,必要时整理内存碎片

(1)Mark-Sweep(标记清除)算法:

Mark-Sweep(标记清除)分为标记和清除两个阶段,在标记阶段会遍历堆中的所有对象,然后标记活着的对象,在清除阶段中,会将死亡的对象进行清除。Mark-Sweep算法主要是通过判断某个对象是否可以被访问到,从而知道该对象是否应该被回收,具体步骤如下:

 垃圾回收器会在内部构建一个根列表,用于从根节点出发去寻找那些可以被访问到的变量。比如在JavaScript中,window全局对象可以看成一个根节点。

 垃圾回收器从所有根节点出发,遍历其可以访问到的子节点,并将其标记为活动的,根节点不能到达的地方即为非活动的,将会被视为垃圾。

 垃圾回收器将会释放所有非活动的内存块,并将其归还给操作系统。

如图所示:

标记-清除法.png

但是经过标记清除之后的内存空间会⽣产很多不连续的碎⽚空间,这种不连续的碎⽚空间中,在遇到较⼤的对象时可能会由于空间不⾜⽽导致⽆法存储。
为了解决内存碎⽚的问题,需要使⽤另外⼀种算法:标记-整理(Mark-Compact)。

(2)标记-整理(Mark-Compact):
标记整理对待未存活对象不是⽴即回收,⽽是将存活对象移动到⼀边,然后直接清掉端边界以外的内存。如图所示:

标记-整理法.png

至此就完成了一次老生代垃圾回收的全部过程,但是由于前文提到的「全停顿」的存在,在标记阶段同样会阻碍主线程的执行,一般来说,老生代会保存大量存活的对象,如果在标记阶段将整个堆内存遍历一遍,那么势必会造成严重的卡顿。因此,V8引擎有引入了Incremental Marking(增量标记)的概念。

增量标记(Incremental Marking):
增量标记将标记过程分为多个小步骤,在 JavaScript 执行的间隙进行,这样可以减少垃圾回收对程序执行的影响。

如下图所示:

阶段说明
JavaScript 执行程序正常运行
增量标记小步骤在程序执行间隙进行标记

并行回收:
V8 还可以利用多核处理器的优势进行并行回收。在垃圾回收过程中,多个线程同时进行标记、清除和整理等操作,提高垃圾回收的效率。

如下图所示:

操作说明
并行标记多个线程同时标记存活对象
并行清除多个线程同时清除未标记对象
并行整理多个线程同时整理内存碎片

三、垃圾回收触发时机

V8 的垃圾回收不是定时进行的,而是在以下情况下触发:

1、内存分配达到一定阈值时。
2、手动调用垃圾回收函数时(如在开发者工具中)。
总之,V8 的垃圾回收机制通过分代回收、增量标记、并行回收等算法,有效地管理内存,提高了 JavaScript 程序的性能和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值