前端垃圾回收方法
一、引用计数算法
1、核心思想:设置引用数,判断当前引用数是否为0。
2、引用计数器。
3、引用关系改变时修改引用数字。
4、引用数字为0是立即回收。
优点:
- 发现垃圾及时回收。
- 最大限度减少程序暂停。 缺点:
- 无法回收循环引用的对象。
- 时间开销大(时刻监测回收)。
二、标记清除算法
1、核心思想:分标记和清除两个阶段完成。
2、遍历所有对象找标记活动对象。
3、遍历所有对象清除没有标记对象。 4、回收相应的空间。
优点:
- 解决对象之间同步引用的问题,可以回收循环引用的对象。 缺点:
- 容易产生碎片化空间,浪费空间。
- 不会立即回收垃圾对象。
三、标记整理算法
1、核心思想:标记整理看做是标记清除的增强。
2、标记阶段的操作和标记清除一致。
3、遍历所有对象清除没有标记对象。
4、清除阶段会先执行整理,在移动对象位置,最后回收相应空间。
优点:
- 减少碎片化空间。 缺点:
- 不会立即回收垃圾对象。
四、V8引擎
- 1、V8是一款主流的JavaScript执行引擎。
- 2、V8采用即使编译。
- 3、V8内存设限(5G & 800M)。
五、V8垃圾回收策略
- 1、采用分代回收的思想。
- 2、内存分为新生代、老生代。
- 3、针对不同对象采用不同算法。
六、V8中常用的GC算法
- 1、分带回收
V8空间一分为二,分为新生代、老生代存储区。小空间用于存储新生代对象,(32M | 116M),新生代对象指的是存活时间较短的对象,老生代对象就是指存活时间比较长的对象,存储空间64位操作系统为1.4G,32位操作系统为700M。
- 2、空间复制
1、回收过程采用复制算法 + 标记算法 。
2、新生代内存划分为两个等大的空间(使用空间为From空间 & 空闲空间为To空间)。
- 3、标记整理
1、标记整理后将活动对象拷贝至To空间 。
- 4、标记清除
1、From空间与To空间交换,完成释放。
- 5、标记增量
1、拷贝过程中kennel出现晋升(晋升就是将新生代对象移动到老生代)。 满足一下条件就会出现晋升:
- 1⃣️ 一轮GC不存活的新生代对象。
- 2⃣️ To空间的使用率超过25%。
内容学习----------输出来源于 拉勾教育