jQuery.data会导致内存泄漏吗?

时间:2011-08-16 16:16:50

标签: javascript jquery memory-leaks circular-reference

以下代码段是否会造成内存泄漏。

根据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'));

4 个答案:

答案 0 :(得分:7)

显然,只要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对象的内容,就不应该有内存泄漏。

答案 1 :(得分:0)

我认为这取决于Javascritp引擎。

您确实需要进行测试。我在对象中添加了一个长字符串,并在一个大循环中运行潜在的泄漏。

因此,我认为在IE8或Chrome中没有漏洞。

但我也无法重现these leakeage patterns

答案 2 :(得分:0)

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

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

所以,最后,会有一个非常大的缓存阵列,这将导致记忆泄漏。 在长期运行的Web应用程序中,这可能会导致内存崩溃。

答案 3 :(得分:-4)

data属性仅存储字符串值。