初步了解ES6的时候,翻到偏后一些的章节总会有一种莫名的不安,很多概念比较抽象,业务中也很难体现出用途,但又不得不去了解,不然总觉得自己算不上熟悉ES6吧。没错,今天我就以weakMap和weakSet为引导,来说说浏览器的垃圾回收机制。

weakSet

WeakSet是一种集合,其中的元素只能是对象和Symbol,并且这些对象是弱引用的。什么是弱引用,我们观察一下这个简单的代码片段:

标记-清除 (Mark-and-Sweep)

标记-清除是最常用的GC策略。工作流程如下:

  1. 标记:GC遍历所有变量,标记活动(正在使用的)变量。
  2. 清除:GC再次遍历,清除未标记的变量,回收其内存。

引用计数 (Reference Counting)

引用计数是另一种策略,通过追踪每个值被引用的次数来工作:

  1. 当值的引用次数为0时,表示该值不再被使用,可以被回收。

循环引用问题

引用计数策略可能会遇到循环引用问题,导致内存无法释放。

在上面的例子中,objectAobjectB互相引用,形成循环。在只使用引用计数的GC中,这会导致内存泄漏。