根据Javascript:最终指南,有两种垃圾收集方法:
Mark-and-Sweep和Reference Counting,在早期浏览器中,垃圾收集是通过引用计数来执行的。
但是为什么他们会求助于Mark and sweep呢?我认为集合的情况是一样的,当一个值不可达时,它的引用计数是零。
那有什么区别呢?
发布于 2013-11-25 06:41:57
引用计数是查找垃圾对象的一种简单的启发式方法,但它并不完美。特别是,引用计数可能导致引用周期,其中不可访问对象的循环都指向另一个对象。当发生这种情况时,对象的所有折算都是非零的,因此对象永远不会被清理,尽管这些对象确实是垃圾。Firefox 2使用纯引用计数来收集垃圾,随着时间的推移,由于引用周期开始消耗所有内存,导致大量内存泄漏。
标记和扫描没有这个问题,因为它显式地从所有已知的可到达位置开始查找所有可访问对象。它可以很好地处理引用周期,尽管运行速度较慢。引用计数(快速但不准确)加上标记和扫描(缓慢但完美)的组合是一个很好的折衷方案。
也就是说,还有更好的GC技术。搜索“世代垃圾收集”,寻找一些更好的混合技术。
希望这能有所帮助!
https://stackoverflow.com/questions/20186087
复制相似问题