【问题标题】:Closure and garbage collection: most efficient way to remove consecutive nodes from a linked list闭包和垃圾收集:从链表中删除连续节点的最有效方法
【发布时间】:2012-11-26 20:27:45
【问题描述】:

我为 javascript 编写了一个快速而肮脏的双向链表实现。我希望能够一次删除多个(连续的)节点,并且想知道:仅切断我要删除的这些最外层节点的末端是否足够,或者我必须单独删除每个节点。如果我正确理解了javascript的垃圾收集,一旦没有任何东西指向那些连续的节点,即使它们仍然相互连接,它们应该由垃圾收集器处理,对吗? 如果有人能告诉我如何自己测试或验证这一点,我也将不胜感激。

【问题讨论】:

    标签: javascript garbage-collection linked-list nodes


    【解决方案1】:

    根据MDN

    截至 2012 年,所有现代浏览器都提供了标记和清除垃圾收集器。过去几年在 JavaScript 垃圾收集(分代/增量/并发/并行垃圾收集)领域所做的所有改进都是该算法的实现改进,但不是对垃圾收集算法本身的改进,也不是它对何时定义的减少“不再需要一个对象”

    标记和扫描算法从根对象开始,找到所有可访问的对象,然后收集所有不可访问的对象,因此对于这些浏览器来说,切断节点就可以了。较旧的浏览器使用引用计数,这意味着对象只有在对它们的引用为 0 时才会被收集,因此在这种情况下,双向链表的循环将是有问题的。然后,您需要以某种方式切断连续节点中的循环(将引用设置为 null、删除关键字等)。

    因此,如果您正在为现代浏览器进行开发,那么一切都很好,但是如果您想要向后兼容 IE6/7 等浏览器,则需要一个稍微复杂的解决方案(总是这样,不是吗.. .)

    【讨论】:

    • 谢谢!链接也很好。
    猜你喜欢
    • 2012-03-15
    • 2023-03-26
    • 2012-01-18
    • 2020-05-15
    • 1970-01-01
    • 2020-01-29
    • 2013-01-26
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多