混淆浏览器垃圾收集算法

时间:2013-11-25 06:29:01

标签: algorithm browser garbage-collection

根据Javascript: the definitive guide,有两种垃圾收集方式:

Mark-and-SweepReference Counting,在早期的浏览器中,垃圾收集是通过引用计数执行的。

但为什么他们转向Mark and sweep?我认为收集情况是相同的,当一个值无法访问时,其引用计数为零。

那有什么区别?

1 个答案:

答案 0 :(得分:0)

引用计数是一种用于查找垃圾对象的简单启发式算法,但它并不完美。特别是,引用计数可以导致引用循环,其中一个不可到达对象的循环都指向彼此。发生这种情况时,对象的所有refcounts都是非零的,因此对象永远不会被清除,尽管对象确实是垃圾。 Firefox 2使用纯引用计数进行垃圾收集,随着时间的推移导致大量内存泄漏,因为参考周期开始耗尽所有内存。

标记和扫描没有此问题,因为它显式查找从所有已知可到达位置开始的所有可到达对象。它可以完美地处理参考周期,但运行速度较慢。引用计数(快速但不准确)加上标记和扫描(缓慢但完美)的组合是一个很好的折衷方案。

那就是说,有更好的GC技术。搜索“分代垃圾收集”以获得一些更好的混合技术。

希望这有帮助!