GC中的垃圾是什么
- 程序中不再需要使用的对象
function func() {
name = ‘lg’
return ${name} is a coder
}
func()
- 程序中不能再访问到的对象
function func() {
const name = ‘lg’
return ${name} is a coder
}
func()
GC 算法是什么
-
GC 是一种机制,垃圾回收器完成具体的工作
-
工作的内容就是查找垃圾释放空间、回收空间
-
算法就是工作时查找和回收所遵循的规则
常见GC算法
-
引用计数
-
标记清除
-
标记整理
-
分代回收
2.3 引用计数、标记清除、标记整理
1. 引用计数
引用计数算法实现原理
-
核心思想: 设置引入数,判断当前引用数是否为0
-
引用计数器
-
引用关系改变时修改引用数字
-
引用数字为0时立即回收
引用计数算法优点
-
发现垃圾时立即回收
-
最大限度减少程序暂停
引用计数算法缺点
-
无法回收循环引用的对象
-
时间开销大
2.标记清除
标记清除算法实现原理
-
核心思想:分标记和清除二个阶段完成
-
遍历所有对象找标记活动对象
-
遍历所有对象清除没有标记对象
(注意:在第二阶段当中,会把第一个阶段所设置的标记给抹掉,便于我们GC下次能正常工作)
- 回收相应的空间
标记清除算法图示
会把回收的空间直接放在一个叫做空闲列表上面,方便我们后续的程序可以直接在这儿可以申请使用
标记清除算法优点
*. 标记清除可以解决循环引用问题
标记清除算法缺点
- 空间的碎片化
由于当前所回收的垃圾对象在地址上它本身是不连续的,从而造成我们回收之后它们分散在各个角落,后续如果我们需要使用,刚好巧了,新的生成空间刚好与之匹配那可以直接用,一但多了或是少了就不太适合使用了。
// 任何的空间都会有两个部分
// 1. 头(存储这个空间的元信息 eg: 大小,地址 — 称为头)
// 2. 域 (存放数据的)
// 如下图 假设一个方块是1个内存空间 左边蓝色的释放后得2个空间、右边蓝色的释放后得1个空间,在释放完成后,其实它们是分散的,也就是地址不连续。
// 地址不连续
// 如果下一次需要申请1.5的空间,左边多了,右边少了。 最大问题-空间碎片化
缺点图示
总结:相对引用计数来说,解决了循环引用问题,缺点则是造成空间碎片化,不能让空间得到最大化的使用
3. 标记整理
标记整理算法实现原理
-
标记整理可以看做是标记清除的增强
-
标记阶段的操作和标记清除一致
-
清除阶段会先执行整理,移动对象位置 – 保证地址连续性
标记整理算法图示
2.2 GC算法总结
引用计数优缺点
-
优点:
-
可以即时回收垃圾对象
-
减少程序卡顿时间
-
缺点
-
无法回收循环引用的对象
-
资源消耗较大s
标记清除
-
优点:
-
可以回收循环引用的对象
-
缺点
-
空间产生碎片化空间,浪费空间
标记整理
-
优点:
-
减少碎片化空间
-
缺点:
-
不会立即回收垃圾对象
真题解析、进阶学习笔记、最新讲解视频、实战项目源码、学习路线大纲
详情关注公中号【编程进阶路】
3. V8引擎
3.1 认识V8
-
V8是一款主流的 JavaScript 执行引擎
-
V8采用即时编译
-
V8内存设限
即时编译: 之前很多的JavaScript引擎都需要将源代码转成字节码,然后再去执行。而对于V8来说,就可以直接将源码翻译成我们当前可以直接执行的机器码,所以这个时候的速度是非常快。
内存设限: 64位的操作系统下,上限是不超过1.5G,对于32位操作系统,上限是不超过800M。
?为什么有内存设限
-
V8本身就是为了浏览器而制造的,现有的内存大小对于网页来说是足够使用了
-
V8内部所去实现的垃圾回收机制,采用这个机制是合理的。
官方做个测试
当我们的垃圾内存达到1.5个G的时候,如果V8采用增量标记的算法进行垃圾回收,只需要消耗50毫秒,而如果采用非增量标记的算法进行回收,则需要1秒钟。那么从用户体验角度来说,1秒钟算很长的时间了,在这里就以1.5个G来为界了。
3.2 V8垃圾回收
V8垃圾回收策略
-
采用分代回收的思想
-
内存分为新生代、老生代
-
针对不同对象采用不同算法
V8垃圾回收策略图示
V8中常用GC算法
-
分代回收
-
空间复制
-
标记清除
-
标记整理
-
标记增量
V8内存分配
-
V8内存空间一分为二
-
小空间用于存储新生代对象(32M | 16M)
-
新生代指的是存活时间较短的对象
什么叫存活时间较短 eg:局部的作用域,这个局部的作用域当中的变量在执行完成之后就肯定要去回收
如何回收新生代对象
新生代对象回收实现
-
回收过程采用复制算法 + 标记整理
-
新生代内存区分为二个等大小空间 (FROM、TO)
-
使用空间为From,空闲空间为To
-
活动对象存储于From空间
-
标记整理后将活动对象拷贝至To
-
From与To交换空间完成释放
最后
为了帮助大家更好的了解前端,特别整理了《前端工程师面试手册》电子稿文件。