v8垃圾回收机制

前言

为什么要有垃圾回收机制

垃圾的产生 程序运行过程中变量的声明,都会占据一定的内存空间,当这些变量对应的值不再被访问时,这些变量及对应的值就没有意义,其对应的内存空间被浪费,那么这些空间就是垃圾。

内存占用 内存空间被占用的越多,系统运行就会越慢,甚至崩溃,所以就需要垃圾回收机制

代际假说

  1. 大部分对象在内存中存在的时间很短
  2. 不死的对象会活得更久

一.栈垃圾回收

首先,JS中的垃圾回收机制是自动回收的,不需要程序员进行额外的操作实现垃圾回收。

在栈中,JS引擎会通过移动ESP指针来销毁保存在栈中的执行上下文

二.堆垃圾回收

垃圾回收主要指的就是回收堆中的垃圾

1.堆分类

  • V8垃圾回收策略主要是基于分代式垃圾回收机制 ,其根据对象的存活时间 将内存的垃圾回收进行不同的分代,然后对不同的分代采用不同的垃圾回收算法。

存活时间长短不同的对象放在不同的堆位置,用不同的垃圾回收器(垃圾回收算法)

  • 新生代(存放生存时间短的对象) 副垃圾回收器 1~8M
  • 老生代(存放生存时间长的对象) 主垃圾回收器

2.垃圾回收器的流程

无论是在哪个区域,回收流程都是一样的

  1. 标记空间中的活动对象和非活动对象(就相当于找出访问不到的对象)
  2. 回收非活动对象所占据的内存
  3. 内存整理(因为回收导致堆空间不连续)

3.副垃圾回收器(Scavege 算法)

通常小对象会先放在堆中的新生代中

  1. 将新生代区域划分为对象空间空闲空间,刚存入的对象放在对象空间
  2. 对象空间存满时,就会做一次回收,剩下没有回收的对象留了下来,没回收的对象复制空闲空间,接着对象空间空闲空间翻转,新存入的对象存在翻转后的空闲空间
  3. 符合一定添加还存活的对象,会被移动到老生代中(对象晋升策略)

堆的分类 新生代回收流程图

4.主垃圾回收器(标记清除算法)

存放存活时间长的对象(来自新生代晋级 的对象),的对象

  1. 递归遍历整个调用栈,标记活动对象和垃圾数据
  2. 回收垃圾数据
  3. 内存整理

5.标记清除算法

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

  1. 垃圾回收器会在内部构建一个根列表,用于从根节点出发去寻找那些可以被访问到的变量。比如在 JavaScript 中,window 全局对象可以看成一个根节点。
  2. 垃圾回收器从所有根节点出发,遍历其可以访问到的子节点,并将其标记为活动的,根节点不能到达的地方即为非活动的,将会被视为垃圾。
  3. 垃圾回收器将会释放所有非活动的内存块,并将其归还给操作系统。

标记整理算法

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

过程:标记整理对待未存活对象不是⽴即回收,⽽是将存活对象移动到⼀边,然后直接清掉端边界以外的内存

5.全停顿-增量标记

由于 JS 运行在主线程,一旦垃圾回收算法生效,那么 JS 的执行就只能暂停,等待垃圾回收完成后再执行,会影响 JS 代码执行效率

为了解决这个问题,就出现了增量标记增量标记 :将原本一次性遍历堆内存的操作改为先遍历堆内存对象中的一部分,然后暂停,让 JS 主线程先执行,再遍历标记堆内存对象中的一部分,循环直到全部遍历标记完。 即:把垃圾回收这个⼤的任务分成⼀个个⼩任务,穿插在 JavaScript 任务中间执⾏,让浏览器空闲时才标记,尽可能少的介绍对主线程的影响,提升性能。

相关推荐
华玥作者8 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_8 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠8 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
sleeppingfrog8 小时前
zebra通过zpl语言实现中文打印(二)
javascript
lang201509288 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC9 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务10 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
baidu_2474386110 小时前
Android ViewModel定时任务
android·开发语言·javascript
嘿起屁儿整10 小时前
面试点(网络层面)
前端·网络
VT.馒头10 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript