我目前正在重新考虑qooxdoo JavaScript框架的对象处理处理 看看下图(A目前在范围内):
diagram http://yuml.me/51747906.jpg
假设我们要删除B.通常,我们会删除所有对象之间的所有引用。这意味着我们在示例中切断了连接1到5。这真的有必要吗?
据我所读here,浏览器使用标记和扫描算法。在这种情况下,我们只需要切割参考1(与示波器的连接)和5(与DOM的连接),这可能会快得多。
但我可以确定所有浏览器都使用标记和扫描算法或类似的东西吗?
答案 0 :(得分:2)
对于任何体面的垃圾收集器(不仅是标记和扫描),切割连接1足以释放B(以及C和D以及窗口)。基于引用计数的分配由于它们的循环引用而无法释放B和D(B引用D和D引用B)但引用计数实际上不是垃圾回收。
我认为可以安全地假设所有浏览器都使用了一个不错的垃圾收集器(好吧,使用浏览器,没有什么是真正安全的,但是不使用适当的垃圾收集器的JavaScript实现是不可能的)。
答案 1 :(得分:2)
问题在于,在理想的世界中,您基本上只需要断开DOM节点和本机事件侦听器。问题是,qooxdoo中的原始系统是围绕像IE6这样的错误浏览器设计的。当我们自己删除时,我们看到大量减少了内存使用量。然而,在今天的世界中,我会以一种在IE6中可行的方式对其进行重新设计,但未针对其问题进行优化。
完整关闭整个应用程序(处理所有应用程序)以及处理应用程序的单个部分也存在差异。在最后一个场景中,你需要非常谨慎地行动,不要处理仍然需要的东西。