你需要知道的前端知识点,V8引擎是什么?采用哪些GC算法?

一、简单介绍V8引擎

  1. V8引擎是一款主流的JavaScript执行引擎;
  2. V8执行引擎采用及时编译(执行速度提升);
  3. V8引擎中内存设置有上限(下方进行详解);

二、V8回收策略

  1. 采用分代回收思想;
  2. 内存分为新生代对象存储与老生代对象存储;
  3. 针对不同的对象采用不同的算法;

在这里插入图片描述

三、常用的GC算法(垃圾回收机制)

  1. 分代回收
  2. 空间复制
  3. 标记清除
  4. 标记整理
  5. 增量算法

四、V8内存分配

在这里插入图片描述

在上图中V8内存空间一分为二 From、To作为新生代对象存储区 其则老生代存储区

新生代存储区介绍

  1. 即存活时间较短的对象(例:局部作用域内的变量执行完需要回收);
  2. 内存区分为两个等大空间(即:From空间、To空间);
  3. 在64位操作系统中内存大小位 32MB,32位操作系统中为16MB;

老生代存储区介绍

  1. 即存活时间较长的对象(例:全局变量、闭包变量数据);
  2. 在64位操作系统中内存大小位 1.5G,32位操作系统中为700MB;

五、新生代对象回收实现

  1. 回收过程采用复制算法+标记整理;
  2. 使用空间为From、空闲空间为To;
  3. 活动对象存储于From空间;
  4. 标记整理后将活动对象拷贝至To空间;
  5. From与To交换空间完成释放;

回收细节说明

  1. 在拷贝过程中可能出现晋升(即:将新生代对象移至老生代对象);
  2. 一轮GC后还存活的新生代需要晋升(移至老生代);
  3. To空间使用率超过25%(From与To进行空间交换时如果不设限会存在空间不足的情况、所以这里限制为25%);

六、老生代对象回收实现

  1. 主要采用标记清理、标记整理、增量标记算法;
  2. 首先使用标记清除完成垃圾空间的回收(存在空间碎片化、但回收速度极快);
  3. 在新生代晋升过程中,老生代空间不足以存放新生代时,则会采用标记整理进行空间优化;(整理碎片化空间);
  4. 采用增量标记进行效率优化;

七、新老生代回收细节对比

  1. 新生代区域垃圾回收使用空间换时间(采用复制算法每时每刻有空闲空间存在,即牺牲一定量空间来提升回收速度);
  2. 老生代区域垃圾回收不适合复制算法(空间较大,一分为二浪费空间,数据量大如果采用复制算法则会消耗许多时间);

八、增量标记如何进行垃圾回收

在这里插入图片描述

如图所示:程序执行与垃圾回收交替执行

总结

  1. V8引擎作为现主流的JavaScript执行引擎;
  2. 内存设置上限(作为web应用来说足够使用,超过1.5G在回收过程中会增加人体感知。 因为在回收执行时程序时停止运行的);
  3. V8采用分代回收的思想实现垃圾回收(即分为新生代、老生代储存区);
  4. V8回收中常见的GC算法 (新生代:复制算法,标记整理。老生代:标记清理,标记整理,增量标记);

最后放上 一张图表达的V8引擎执行过程 方便吸收理解
感兴趣的小伙伴可以看看喔

猜你喜欢

转载自blog.csdn.net/qq_45284938/article/details/127975970