#知识点记录# 谈谈垃圾回收。最原始的垃圾回收算法就是引用技术,判断一个对象有多少个引用来决定是否应该回收,但是这样就会有孤岛问题,也就是循环引用的问题。现代的 JavaScript 垃圾回收算法是通过“标记清除(mark-and-sweep)”的方式,把概念转换成 reachable 和 unreachable 来解决这个问题。从 root 开始查找,回收 unreachable 的对象。这里的 root 是指当前函数的局部变量和参数,嵌套调用时当前调用链上所有函数的变量与参数,还有全局变量等。如果一个值可以通过引用或引用链从根访问任何其他值,则认为该值是可达的。

我觉得对于垃圾回收,主要是理解标记清除就好。当然除了这个之外,还有:

- 分代回收(Generational collection):有些对象用完就没用了,有些像全局变量,是长期使用的,针对这种差别优化垃圾回收的检测算法;
- 增量回收(Incremental collection):有时候需要清除的垃圾很多,马上进行垃圾回收,会影响 Web 性能,那么就会分批次,一部分一部分清除;
- 闲时回收(Idle-time collection):也是为了优化性能,降低垃圾回收对正常网页的影响。

这些都是 V8 引擎的知识,优化算法,对于前端正常来说,就是一定要理解标记清除和孤岛。那么在语言相关的内容都掌握了之后,我准备再好好看看 V8 底层的相关内容。
展开
2