美文网首页前端开发那些事儿
v8引擎垃圾回收机制 - 标记机制

v8引擎垃圾回收机制 - 标记机制

作者: JX灬君 | 来源:发表于2021-08-03 00:33 被阅读0次

    早期node用的全停顿标记

    扫描的时候,一次性全部扫描,扫描到到会给标记,扫描结束,没有被标记到的就是垃圾。

    Node(v12)之后,开始采用增量标记&三色标记法组合式的方式。

    • 三色标记法:
      • 白色 - 尚未访问过
      • 黑色 - 本对象已访问过,而且本对象,而且本对象引用到到其他对象也都全部访问过了
      • 灰色 - 本对象已访问过,但是本对象引用到到其他对象尚未全部访问完,全部访问后,会转换成黑色。
    • 增量标记:
      增量标记不同与一次性全部扫描的全停顿标记法,采用的是一步一步逐步标记的方法。

      1. 一开始所有变量都是白色。
      2. 以GC Roots为根节点,首先找到最大的父节点GA -》将节点变成灰色,表示对象被GC Roots扫描过。
      3. 访问完GC Roots根节点下最大到父节点GA后,将所有灰标会变成黑标
      4. 然后在父节点GA到节点下找到最大的节点GB置为灰色,以此类推(递归的方法)。直到没有灰标,跳出循环,表示我们扫描到的内容就是变量,其他没扫描到的就是垃圾,一会清除掉。
    • 增量标记的优越性
      1.基于js和node都是单线程。
      2.GC垃圾回收机制介入扫描时,会进行线程的切换,从js执行线程切换到GC扫描线程
      3.GC清除1.5G内容花费时间约50ms
      4.如果用的全停顿标记法,那么可能因为时间过长出现页面卡顿的过程。
      5.而增量标记法,通过逐步标记的方法,不断切换线程和标记线程,从根本降低页面卡顿的问题,让整个js线程执行的更加线性,感官上更加顺滑。

    相关文章

      网友评论

        本文标题:v8引擎垃圾回收机制 - 标记机制

        本文链接:https://www.haomeiwen.com/subject/ryxdvltx.html