【问题标题】:JavaScript memory management pitfalls?JavaScript 内存管理的陷阱?
【发布时间】:2010-12-03 21:31:29
【问题描述】:

我知道 JavaScript 有一个垃圾收集器。因此,使用 delete 只删除对该对象的引用,当不再对该对象的引用时,它被 GC 删除。

JavaScript 很棘手,由于闭包、模糊的命名空间和原型继承,要知道什么时候到现在或为什么并不总是很明显。

我正在编写一个相当大的 JavaScript 项目,并希望避免内存泄漏,同时限制全局内存使用。我根本没有处于优化阶段(让我们先让这些东西工作:-)),但是为了避免编写糟糕的代码,了解内存管理的良好实践会很好。

  • 那么我应该什么时候使用delete?
  • 我应该避免哪些陷阱, 使用对象?
  • 关于闭包的一些知识?
  • 要强调一些好的做法?

【问题讨论】:

  • to know when to **now** or why 是否有错字?我无法解析这点英文...
  • 我自己都无法理解我自己。也许我喝醉了,或者我在写这篇文章时刚刚醒来。或两者。无视就好。

标签: javascript memory-management garbage-collection


【解决方案1】:

根据我的经验,垃圾收集器的实现好坏取决于浏览器。应用良好的面向对象编程实践是一个好的开始。

我唯一的建议:不要通过连接 DOM 和 javascript 对象来造成内存泄漏(不会被 DOM 和 JS GC 清除的循环引用)。这些错误会比您在应用程序中实例化的任何对象消耗更多的内存。

有关 DOM/JS 内存泄漏的更多详细信息。 http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

【讨论】:

  • 同意将 DOM 与 js 对象连接是我所知道的最大问题。我认为大多数浏览器对 DOM 和 js 对象分别有不同的内存堆,因此在它们之间建立连接通常会导致内存泄漏。另一个有用的链接:ibm.com/developerworks/web/library/wa-memleak
【解决方案2】:
  • 在 IE 中,至少在旧版本中,如果 DOM 元素附加了事件侦听器,则在您使用 removeChild 将其删除后,它会保留在内存中。将其从内存中删除的唯一方法是在将事件从 DOM 中删除之前将其分离。
  • 只要您不经常创建和删除元素,您就不必担心这一点。如果您在应用程序启动时创建了很多元素,但之后没有创建新对象,则不必太担心内存泄漏。

【讨论】:

    【解决方案3】:

    我认为通过将数据存储在 DOM 节点上,您可以轻松创建并非所有浏览器都能处理的循环引用。例如:

    this.element = document.getElementById('something');
    this.element.attachedObject = this;
    

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      相关资源
      最近更新 更多