我目前正在重新考虑 qooxdoo JavaScript 框架的对象处置处理。
请看下图(A 目前在范围内):
假设我们要删除 B。通常,我们切断所有对象之间的所有引用。这意味着我们在示例中切断了连接 1 到 5。这真的有必要吗?
据我在这里阅读,浏览器使用标记和扫描算法。在这种情况下,我们只需要剪切引用 1(与范围的连接)和 5(与 DOM 的连接),这可能会更快。
但是我可以确定所有浏览器都使用标记和扫描算法或类似的算法吗?
我目前正在重新考虑 qooxdoo JavaScript 框架的对象处置处理。
请看下图(A 目前在范围内):
假设我们要删除 B。通常,我们切断所有对象之间的所有引用。这意味着我们在示例中切断了连接 1 到 5。这真的有必要吗?
据我在这里阅读,浏览器使用标记和扫描算法。在这种情况下,我们只需要剪切引用 1(与范围的连接)和 5(与 DOM 的连接),这可能会更快。
但是我可以确定所有浏览器都使用标记和扫描算法或类似的算法吗?
对于任何体面的垃圾收集器(不仅仅是标记和清除),切断连接 1 就足以释放 B(以及 C 和 D 以及窗口)。基于引用计数的分配将无法释放 B 和 D,因为它们的循环引用(B 引用 D 和 D 引用 B)但引用计数并不是真正的垃圾回收。
我认为可以安全地假设所有浏览器都使用了像样的垃圾收集器(好吧,对于浏览器来说,没有什么是真正安全的,但是不使用正确垃圾收集器的 JavaScript 实现仍然是不可能的)。
问题是,在理想世界中,您基本上只需要断开 DOM 节点和本地事件侦听器。问题是,qooxdoo 中的原始系统是围绕 IE6 等有缺陷的浏览器设计的。当我们自己尽可能多地删除时,我们看到内存使用量大大减少。然而,在当今世界,我会重新设计它,使其在 IE6 中还可以,但没有针对它的问题进行优化。
完全关闭整个应用程序(全部处理)和只处理应用程序的一小部分也有区别。在最后一种情况下,您需要非常小心地采取行动,不要丢弃仍然需要的东西。