【问题标题】:JavaScript - large for loop, should I release objects?JavaScript - 大型 for 循环,我应该释放对象吗?
【发布时间】:2018-02-27 08:14:05
【问题描述】:

我有一个 for 循环,它迭代了相当多的项目。

在每次迭代开始时,我使用相同的 var newObj = new ...

但是,我想知道,这是每次都完全替换该对象,还是应该在每次迭代结束时释放它。

如果我应该发布 - 我该如何发布?

例如 - 假设 x 是一个很大的数字(10.000 作为一个高示例)

for (var x = 0; x<10000; x++) {
   var newObj = new someThing(x, y, z)
   newObj.dance()
   newObj.andDanceMore()

   //Should I do some kind of release here - or am I replacing it each time
}

谢谢。

【问题讨论】:

  • 必须在循环中使用999999 的事实已经是一个主要的危险信号。
  • releasing it - 你会怎么做?
  • 你正在重写变量,所以我认为你不必担心内存
  • 不要问“一般”的问题,那是没有意义的。就您遇到的真实、实际、可重现的问题提出真实的问题。
  • 正如“Merigold”所说,从 1 到 99999 的循环本身就是一个问题。无论如何,当不需要变量时,您可以使用 'let' 代替 'var' 和 'strict mode' 来释放内存。 stackoverflow.com/questions/762011/…

标签: javascript node.js


【解决方案1】:

在 javascript 中,您不必担心“释放”分配的内存,

from the great MDN docs

高级语言(如 JS)嵌入了一个名为“garbage”的软件 收集器”,其工作是跟踪内存分配和使用,以便 查找一块分配的内存何时不再需要 在这种情况下,它会自动释放它。这个过程是一个 近似因为知道某个片断的一般问题 需要多少内存是无法确定的(无法通过算法解决)。

基本上 G.C 的一般行为是当一个对象对它的引用为零时 - 它可以被垃圾回收。

在您引用的情况下,每次您为var newObj 分配一个新值时,G.C 都会检测到对它的 0 次引用并垃圾收集它 - 释放它 -

【讨论】:

    【解决方案2】:

    简短回答:不。

    稍微长一点的答案:JavaScript 中没有手动内存管理。它是一种垃圾收集语言。每次启动 GC 时(您无法控制何时发生),所有没有引用的对象都会被自动收集,从而有效地释放它们占用的内存。

    延伸阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

    【讨论】:

      【解决方案3】:

      你知道什么是垃圾收集器吗?如果没有,您可以在谷歌上搜索“node.js 垃圾收集”找到非常不错的博文。

      简而言之:

      1) 当您覆盖变量值(或局部变量随其作用域一起被删除)时,对象仍保留在内存中。

      2) 当 Node.js 决定运行垃圾收集器时,您的对象将在以下情况下从内存中清除:

      2.1) 没有变量,包含它(实际上是指向它)。

      2.2) 有一些变量/属性指向它,但是具有相互链接的整个对象和闭包集群被识别为孤立的。

      3) 您可以强制垃圾收集器运行 (How to request the Garbage Collector in node.js to run?),但通常情况下您不需要这样做。

      4) cmets 中提到的letvar 之间的区别不会影响您的情况。是的,letvar 更本地化,但是什么?如果 Node.js 丢弃 let 变量退出循环,或者您使用新值覆盖任何变量(varlet、属性 - 不管),结果是相同的。

      【讨论】:

        【解决方案4】:

        var newObj 只会被执行一次。程序所做的就是在循环中不断赋值给newObj,没有被引用的对象会被GC回收。

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 2011-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 2011-03-21
          • 2017-04-01
          • 1970-01-01
          相关资源
          最近更新 更多