浏览器(V8)的垃圾回收机制


内存管理

在学习垃圾回收机制之前,有必要学习一下内存管理的概念:
1.内存:由可读写单元组成,表示一片可操作空间。
2.管理:人为的去操作一片空间的申请,使用和释放。
3.内存管理:开发者主动申请空间,使用空间,释放空间。
4.管理流程:申请空间——使用空间——释放空间

什么是浏览器中的垃圾?

1.对象不再被引用时是垃圾。
2.对象不能从根上被访问是垃圾。
与垃圾相反的是可达对象:
1.可以访问到的对象就是可达对象。
2.可达的标准就是从根出发,看看能否找到这个对象。(根是全局变量对象)

常见的GC算法

一. 引用计数

引用计数器: 为每一个对象设置一个引用计数器,当对象被引用的时候,计数器加1,反之减1,当为0的时候,立即回收。
优点: 发现垃圾就能立即回收,最大限度减少程序暂停。(垃圾回收的时候,程序是要暂停的)
缺点: 无法回收循环利用的对象,时间开销大(如果有很多对象,每个对象上面都有一个计数器,那么在性能上面并不乐观)
简单了解一下循环利用对象:

let obj1 = {
  name: 'obj1'
}

let obj2 = {
  name: 'obj2'
}
obj1.next = obj2
obj2.pre = obj1

console.log(obj1, obj2); // { name: 'obj1', next: { name: 'obj2', pre: [Circular] } } { name: 'obj2', pre: { name: 'obj1', next: [Circular] } }

二. 标记清除

标记清除分为标记和清除两个阶段:
1.第一次遍历给所有活动对象(可达对象)打上标记。
2.第二次遍历把没标记的对象清除掉,且去掉有标记对象上的标记(为第二次gc做准备)。
3.把回收的空间放在空闲链表,方便用户调用。
优点: 可以回收循环利用的对象。
缺点:空间碎片化,不会立即回收垃圾对象。
什么是空间碎片化?如下图所示,A,B两块内存,因为从根访问并不可达,所以要回收。那么此时,如果用户需要创建一块内存空间需要1.5个域,那么只能在A中创建,但是会多出来0.5个域,这0.5个域因为空间太小,可能就一直荒废在那里了,造成空间浪费;如果用户需要创建一块内存空间需要2个域,那么只能在内存空间中再开辟新地址,无法在刚刚回收的A,B中创建。那么以上这种“高不成,低不就”的结果,就是空间碎片化。
在这里插入图片描述

三. 标记整理

标记整理是标记清除的加强版,它在清除对象前,会优先整理内存空间,移动对象位置,把所有活动对象移到一起,形成一片连续的内存空间,那么剩下的内存空间,要么就是准备要清除的,要么就是原本就空出来的。用两个图去表示会更加好理解:

在这里插入图片描述
在这里插入图片描述

V8内核

简介:V8是有google开发的开源javascript引擎,用于Chrom中,同时也用于node.js中。
功能:V8在执行之前就把JS编译成机器码,JS程序与V8引擎的速度媲美二进制编译。

V8的垃圾回收策略

V8主要采用分代回收的算法,内存中分为新生代区域,和老生代区域,不用区域采用不同的gc算法。

V8内存分配

在这里插入图片描述
V8的内存分为两块,一块是新生代,其中新生代又分为From区域和To区域,另外一块就是老生代区域。

新生代区域及算法

新生代空间:在64位计算机上是32M,32位上是16M。
新生代指的是存活时间较短的对象,比如局部作用域中的对象。
新生代回收实现:复制算法+标记整理
活动对象总是存储与From空间中,标记整理过后,就会把From空间的对象拷贝到To空间,然后释放From空间中的内存,最后一步交换From,To空间,使得活动对象总是放在From空间中。
晋升:新生代对象进入老生代
什么时候需要晋升?
1.一轮gc后还存活的对象需要晋升。
2.To空间的使用率超过25%,这是为了From,To空间交换后,让From空间有足够的内存给予用户使用。

老生代区域及算法

老生代空间:在64位计算机上是1.4g,32位上是700M。
对老生代对象还是主要采用标记清除,标记整理,增量标记的算法。
1.首先采用标记清除完成垃圾空间的回收。
2.采用标记整理对空间进行优化。
3.采用增量标记进行效率优化。
关于增量标记,用一个图来表示:
在这里插入图片描述
程序的执行与标记的过程是交替进行的,把以往一次性遍历全部对象的过程分为多次进行。这样给予用户的体验更加,不会造成明显的卡顿现象。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值