垃圾回收机制之v8引擎

v8的内存分配 (栈(执行环境)跟堆)

堆内存负责垃圾回收机制,只有新生代和老生代两部分

新生代:对等分的(严格)
老生代: 都是由新生代转变的(连续的空间)

在这里插入图片描述

内存空间

在这里插入图片描述
注意: node(v14)已经为2GB了,内存空间可改 (因为node底层是c++,可以扩)

为什么内存才2GB(1.4GB)呢?

因为前端代码是不持久化的,做更多的是轻业务
如果回收一次1.5g堆内存50ms,那4GB要200ms
200ms专门用来回收垃圾什么事情都不做的话,显然是不能接受的,那么慢,所以更多把js做的比较轻,所以v8到现在才扩到2GB,因为没必要那么大

垃圾回收算法

新生代简单来说是copy scavenge 算法(新生代互换)
老生代 就是标记整理清除 之前是标记清除,现在是标记整理

一开始变量都是在新生代中的,满足条件才会到老生代

在这里插入图片描述

一开始有obj在from空中,之后有obj1,obj2也在from中,之后obj1,obj2代码删除了,但是内存还没有清除,只是告诉内存是垃圾,然后这个时候要加入obj3,发现form空间满了,GC就会对form进行清除,然后就把obj跟obj3copy到to空间,然后把form跟to空间对调,来回往复,这就叫新生代互换,

问题:
新生代为什么要采用copy这种形式呢?
From有32MB To也是,牺牲空间换时间(时间复杂度优先)
因为总有一半被浪费掉,因为空间浪费,copy又是最简单的操作,只要互换就行

老生代为什么不用copy呢?
因为老生代有1400MB太大了

GC有个根节点,所有变量都会变根引用

老生代算法:
  1. 广度扫描
  2. 标记
  3. 增量标记

因为速度快了, 主线程—>GC—>主线程—>GC 可能1次GC只标记了几个,让现场切换的更频繁

标记清除:
在这里插入图片描述
在这里插入图片描述

标记整理清除:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先整理后清除,
先整理后清除会覆盖垃圾,就减少了清除的操作了

新生代什么时候晋升为老生代

在这里插入图片描述

各位大佬们,觉得可以点个赞呗!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值