根据Javascript: the definitive guide,有两种垃圾收集方式:
Mark-and-Sweep
和Reference Counting
,在早期的浏览器中,垃圾收集是通过引用计数执行的。
但为什么他们转向Mark and sweep
?我认为收集情况是相同的,当一个值无法访问时,其引用计数为零。
那有什么区别?
答案 0 :(得分:0)
引用计数是一种用于查找垃圾对象的简单启发式算法,但它并不完美。特别是,引用计数可以导致引用循环,其中一个不可到达对象的循环都指向彼此。发生这种情况时,对象的所有refcounts都是非零的,因此对象永远不会被清除,尽管对象确实是垃圾。 Firefox 2使用纯引用计数进行垃圾收集,随着时间的推移导致大量内存泄漏,因为参考周期开始耗尽所有内存。
标记和扫描没有此问题,因为它显式查找从所有已知可到达位置开始的所有可到达对象。它可以完美地处理参考周期,但运行速度较慢。引用计数(快速但不准确)加上标记和扫描(缓慢但完美)的组合是一个很好的折衷方案。
那就是说,有更好的GC技术。搜索“分代垃圾收集”以获得一些更好的混合技术。
希望这有帮助!