前端垃圾回收原理与方法

66 阅读2分钟

前端垃圾回收方法

一、引用计数算法

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%。

内容学习----------输出来源于 拉勾教育