【问题标题】:What garbage collection algorithms do all 5 major browsers use?5 大浏览器都使用什么垃圾回收算法?
【发布时间】:2010-04-19 12:14:34
【问题描述】:

我目前正在重新考虑 qooxdoo JavaScript 框架的对象处置处理。
请看下图(A 目前在范围内):

diagram http://yuml.me/51747906.jpg

假设我们要删除 B。一般来说,我们会切断所有对象之间的所有引用。这意味着我们在示例中切断了连接 1 到 5。这真的有必要吗?
据我阅读here,浏览器使用标记和扫描算法。在这种情况下,我们只需要剪切引用 1(与作用域的连接)和 5(与 DOM 的连接),这会更快。
但是我可以确定所有浏览器都使用标记和扫描算法或类似的算法吗?

【问题讨论】:

  • 也许您应该告诉我们您认为 5 大浏览器 是什么。例如,它们是 IE6、IE7、IE8、FF3 和 Safari 吗?!
  • 5 大浏览器我的意思是 FF (2, 3, 3.5, 3.6), Opera (9, 10, 10.5), Safari (3, 4), Chrome (2, 3, 4, 5) ) 和 IE (6, 7, 8)。

标签: javascript garbage-collection qooxdoo


【解决方案1】:

对于任何体面的垃圾收集器(不仅仅是标记和清除),切断连接 1 就足以释放 B(以及 C 和 D 以及窗口)。基于引用计数的分配将无法释放 B 和 D,因为它们的循环引用(B 引用 D 和 D 引用 B)但引用计数并不是真正的垃圾回收。

我认为可以安全地假设所有浏览器都使用了不错的垃圾收集器(好吧,对于浏览器来说,没有什么是真正安全的,但是不使用适当的垃圾收集器的 JavaScript 实现仍然是不可能的)。

【讨论】:

  • 引用计数不足以实现垃圾回收,但它仍然可以成为体面的 GC 的一部分。当计数达到 0 时,您肯定知道可以收集该对象。这个快捷方式可以让你 GC 很多对象,而无需昂贵的标记和清除步骤。此外,当进行标记和清扫的时间到来时,需要清理的垃圾就更少了。
  • 引用计数很昂贵,因为更新计数(尤其是关于缓存)。渐近地,即使没有循环,标记和清除也比引用计数便宜。然而,引用计数在某些情况下可以更好地与虚拟内存交互,这就是 Perl 使用它的原因(Perl 相信通过名称而不是指针进行动态绑定,因此创建的“真实循环”很少;然而,Perl also 有一个mark-and-sweep GC)。
【解决方案2】:

问题是,在理想情况下,您基本上只需要断开 DOM 节点和本地事件侦听器。问题是,qooxdoo 中的原始系统是围绕 IE6 等有缺陷的浏览器设计的。当我们自己尽可能多地删除时,我们看到内存使用量大大减少。然而,在当今世界,我会重新设计它,使其在 IE6 中还可以,但没有针对它的问题进行优化。

完全关闭整个应用程序(全部释放)和只释放应用程序的一小部分也有区别。在最后一种情况下,您需要非常小心地采取行动,不要丢弃仍然需要的东西。

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 2017-11-16
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多