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