JavaScript:2011 年我应该担心内存泄漏吗?

标签 javascript memory-leaks

JavaScript 中内存泄漏的话题并不经常被提及。然而,我偶然发现了this article ,写于 2007 年。作者指出:

Internet Explorer and Mozilla Firefox are the two Web browsers most commonly associated with memory leaks in JavaScript.

2011 年我还应该担心 JavaScript 内存泄漏吗?如果是这样,我应该注意什么?

最佳答案

优秀的 JavaScript 开发人员会意识到可能导致内存泄漏的各种设计模式,并且您会避免在您编码的几乎所有页面中编写任何可能导致泄漏的代码。

例如,在 JavaScript 变量中保留对任何 DOM 对象的引用将使该 DOM 对象在内存中保持事件状态,即使它早已从 DOM 中删除并且您打算释放它。

实际上,泄漏仅在某些情况下才显着。这是我特别担心的地方:

  1. 我在计时器上重复执行的任何操作,特别是当它可以长时间运行时。例如,如果您有一个可能会永远循环的幻灯片,则必须绝对确保幻灯片中没有任何内容是 JS 或 DOM 对象的累积泄漏。
  2. 一个像应用程序一样工作的网页,用户可能会长时间停留在同一页面上,与页面交互,执行 ajax 调用等...例如,一个网络邮件应用程序可能打开并在相同的实际浏览器文档在很长一段时间内进行大量的用户和服务器交互。
  3. 定期创建和销毁大量 DOM 元素的网页,就像定期使用 ajax 获取一堆新 HTML 的网页一样。

我不太担心泄漏的地方:

  1. 网页没有用户可以执行的一组长时间运行的交互。
  2. 在加载其他页面或重新加载此页面之前,该网页不会在屏幕上停留很长时间。

我密切关注的一些关键事项。

  1. 创建/销毁 DOM 元素时包含对 DOM 元素的引用的任何持久 JS 变量或属性。
  2. 包含对其他 DOM 对象的引用的 DOM 对象的任何属性,或对包含对其他 DOM 对象的引用的 JS 对象的引用(这可能会在 JS/DOM 之间创建循环引用和交叉引用,某些较旧的浏览器无法释放这些引用)。
  3. 我加载供临时使用的任何大型数据结构。我确保不保留对这些大型数据结构的引用。
  4. 任何数据缓存。确保没有缓存任何您不想缓存的大数据。确保所有重复使用的缓存不会永远累积,并具有某种老化机制来清除旧对象。

关于JavaScript:2011 年我应该担心内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7381201/

相关文章:

javascript - React Router 将 props 传递给 <Link/> 渲染的组件?

javascript - 如何简化嵌套的 JavaScript 循环

ios - 在启用 ARC 的情况下在 C 代码中执行 Objective-C 代码时出现运行时内存泄漏警告

ios - 内存泄漏从服务器下载图像

valgrind 的 c 快速排序内存泄漏

iphone - 为什么这会导致内存泄漏

javascript - 如何在使用jquery插入 `thead`之前插入 `tbody`

带有 jquery css 的 Javascript 函数无法运行(没有错误)

javascript - 如何在 React 中过滤列表为空时显示消息

c - 即使在 fclose 之后使用 valgrind 也会出现内存泄漏问题