【问题标题】:Can jQuery.data cause a memory leak?jQuery.data 会导致内存泄漏吗?
【发布时间】:2011-10-28 05:26:39
【问题描述】:

以下代码会造成内存泄漏吗?

根据 jQuery 文档,使用 data 函数可以避免内存泄漏。确认以下内容是否安全会很有用。

var MyClass = function(el) {
    // Store reference of element in object.
    this.element = $(el);
};

// Store reference of object in element.
$('#something').data('obj', new MyClass('#something'));

【问题讨论】:

  • 为什么不在全局js对象中保存引用?
  • @ant_Ti 我希望有两种访问方式。例如,在一个事件处理程序中,我想访问obj,但我也希望能够从obj 访问元素。
  • 我编辑了问题以删除提到的循环引用,因为这个例子不包含一个。 (虽然看起来可能)

标签: javascript jquery memory-leaks circular-reference


【解决方案1】:

这可能会导致内存泄漏。 jQuery.data方法的原理是可以使用一个Data内部类来缓存dom元素的数据。

当然,当你删除缓存数据时,jQuery 会取消引用数据。 但是内部缓存是一个递增的数组,当你使用它时,它会继续。

所以,最终会有很大的缓存数组,这会导致内存泄漏。 在长期运行的网络应用中,这可能会导致内存泄漏崩溃。

【讨论】:

    【解决方案2】:

    很明显,只要 DOM 元素仍然连接到 DOM,代码本身就会占用额外的内存。但我猜你是在问它是否会在不再使用 DOM 元素后继续使用额外的内存。

    更新:感谢 Joey 的回答(他已将其删除),我花了一些时间阅读 memory leaks in javascript,看来我在下面段落中的假设是不正确的。因为 DOM 元素不使用纯垃圾回收,所以像这样的循环引用通常会阻止 DOM 元素和 javascript 对象被释放。但是,我相信这个答案的其余部分仍然是正确的。

    如果没有深入了解 javascript 引擎如何实现垃圾收集,我无法就该主题发表权威性发言。但是,我对垃圾收集的一般理解使我认为您的代码将是“安全的”,因为从 DOM 中删除 #something 元素后,生成的 MyClass 对象只会引用一个对象没有其他联系。垃圾收集器的图算法应该能够识别出 DOM 元素及其MyClass 对象“漂浮在空间中”并且与其他所有内容无关。

    此外,一旦从 DOM 中移除与给定 DOM 元素相关联的数据和事件,jQuery 会竭尽全力剥离。来自documentation

    jQuery 确保在通过 jQuery 方法删除 DOM 元素以及用户离开页面时删除数据。

    所以假设你一直使用 jQuery,一旦对象从 DOM 中移除,你只会有一个单向引用,这使得垃圾收集器更容易知道它可以摆脱这些对象。

    只要在移除 DOM 元素后没有引用 MyClass 对象的其他内容,就不会出现内存泄漏。

    【讨论】:

      【解决方案3】:

      我想这取决于 Javascritp 引擎。

      您的问题恰好足以进行测试。我在对象中添加了一个长字符串,并在一个大循环中运行了潜在的泄漏。

      因此,我认为 IE8 和 Chrome 中都没有泄漏。

      但我也无法复制these leakeage patterns

      【讨论】:

        【解决方案4】:

        data 属性只存储字符串值。

        【讨论】:

        • 在 jQuery 中它可以是任何 Javascript 类型,包括数组或对象。
        • @ant_Ti -- 文档中的什么地方这么说的?
        • .data() description 说 value 新数据值;它可以是任何 Javascript 类型,包括数组或对象。
        • @Neal 请参阅以“jQuery.data() 方法允许我们附加...”开头的段落(api.jquery.com/jQuery.data)我担心元素引用存储在对象本身中。
        • @Lea Hayes,您误解了文档。数据引用不存储在对象中,它是全局存储并与 dom 节点关联的。请参阅我的更新答案。
        猜你喜欢
        • 2021-03-23
        • 2021-09-25
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 2011-06-16
        • 1970-01-01
        相关资源
        最近更新 更多