繁体   English   中英

jQuery.data 会导致 memory 泄漏吗?

[英]Can jQuery.data cause a memory leak?

以下代码是否会造成 memory 泄漏。

根据 jQuery 文档,使用data function 避免了 memory 泄漏。 确认以下内容是否安全将很有用。

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

显然,只要 DOM 元素仍然连接到 DOM,就目前的代码将占用额外的 memory。 但我猜你在问它是否会在不再使用 DOM 元素后继续使用额外的 memory 。

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

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

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

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

因此,假设您始终使用 jQuery,一旦从 DOM 中删除 object,您将只有一个单向引用,这使得垃圾收集器 更容易 知道它可以摆脱这些对象。

因此,只要您在移除 DOM 元素后没有引用MyClass object 的其他内容,就不应该有 memory 泄漏。

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

当然,当您删除缓存数据时,jQuery 将取消引用该数据。 但是内部缓存是一个递增的数组,当你使用它时,它会在 go 上。

所以,最终会有很大的缓存数组,这会导致内存泄漏。 从长远来看 web 应用程序,这可能会导致 memory 崩溃。

我想这取决于 Javascritp 引擎。

你有足够的问题来进行测试。 我在 object 中添加了一个长字符串,并在一个大循环中运行了潜在的泄漏。

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

但我也无法重现这些泄漏模式

data 属性只存储字符串值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM