JS性能优化之标记清除算法

1,189 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

什么是标记清除算法?

标记清除算法是一种直接的全面停顿算法。简单的说,它们找出所有不可达的对象,并将它们放入空闲列表Free。

标记清除算法的运行过程

清扫过程将分为标记阶段和清扫阶段。

  • 标记阶段
    • 遍历所有对象找标记活动对象
  • 清扫阶段 遍历所有对象清除没有标记对象,同时他会清除第一阶段所作的标记,便于之后可以进行正常的工作,

图示

image.png

如图所示,在我们 global中使用,我们会递归下面的属性,并为可达对象添加一下对应的标记,而a1b1并没有在global中使用,就会在下一轮中被清除掉

标记清除算法优缺点

优点

正所谓人无完人,算法也是如此没有算法是百分之百完美的,有优有劣,但是人都是比较出来的嘛!相对于引用计算算法,他有一个非常非常的大的优势就是它可以回收互相引用的对象值。哈哈哈哈哈哈!

缺点

image.png 如图所示,我们模拟内存的存储情况,红色区域是我们的可达对象,在可达对象有两个无法达到的区域,这种情况下,在进行清除操作的时候,左右两个会被清除,并将空间放入空闲空间,之后内容进入的时候再分配给该对象。

空间碎片化 image.png 这种方式清理出来的内存是不连续的,产生内存碎片,需要维护一个空闲列表,像我们只有回收虽然是回收了3个节点,但是因为不联系的关系空间的使用并不正常完美

总而言之

  • 效率不高
  • 在进行GC的时候,需要停止整个应用程序,导致用户体验差
  • 这种方式清理出来的内存是不连续的,产生内存碎片,需要维护一个空闲列表;