【问题标题】:Can this function be garbage-collected?这个功能可以被垃圾收集吗?
【发布时间】:2015-03-30 08:38:05
【问题描述】:

考虑一下这块蛋糕...嗯,代码:

'use strict'

function doWork () {
  return new Promise(function (resolve, reject) {
    // work work work...
    // Done! But... where's the resolve() ???
  })
}

doWork().then(function doMoreWork () {
  // Some more work to do...
})

一旦 Promise 的构造函数中的函数完成......

  1. Promise 对象是否可被垃圾回收?
  2. doMoreWork() 可回收吗?

我的猜测是 doMoreWork() 不能直接被 GC-ed 因为 Promise 保留对它的引用,但是一旦 Promise 的主体完成并将执行上下文返回到上层 (?) 范围,堆栈就会展开(因为那里is no more statements here to be executed) 并且 Promise 变得无法访问,因此可以被垃圾回收。

你能确认我对这个话题的理解是正确的吗?

我如何凭经验观察这种行为? 换句话说,我如何监控哪些对象正在被 GC 以及何时?我纯粹在 Node.js 中开发,如果这有什么不同的话。

【问题讨论】:

  • 你的意思是你的工作从不调用resolve()?是的,在这种情况下,您的所有对象都会立即被 gc 怀疑。

标签: javascript node.js garbage-collection v8


【解决方案1】:

没有任何东西保留对承诺的引用,因此它将被垃圾收集。承诺是唯一保持对函数doMoreWork 的引用,因此它也会被垃圾回收。

我如何凭经验观察这种行为?换句话说,我如何监控哪些对象正在被 GC-ed 以及何时?我纯粹在 Node.js 中开发,如果这有什么不同的话。

V8 中的 GC 不一定会收集对象。例如,如果这是您的整个程序,那么首先运行任何 GC 都是浪费时间。

【讨论】:

    【解决方案2】:
    1. 如果没有指向它的引用,Promise 对象是可收集的。 如果使用doWork().then(...),则会创建一个临时引用。所以在.then 不再阻塞之前,存在对该对象的引用,因此无法收集它
    2. 你说得对,doMoreWork 也是不可收藏的,因为 Promiseobject 引用了它

    声明doWork().then(...)可以替换为

    new Promise(function (resolve, reject) {
      // work work work...
    }).then(function doMoreWork () {
              // Some more work to do...
            })
    

    所以你可以想象你是直接使用Promiseobject,所以“Upper”-Scope就是使用对象的地方。

    当没有更多引用对象时,通常会收集对象。即使代码在 Promise 中,它也只是一个对象,并且对 then 的调用是链式调用的,因此正在使用该对象

    【讨论】:

    • 我觉得 Esailija 的回答应该是对的,但是不知道 Promise 的实现是无法证明的。创建了 Promise,对其进行了一次 .then() 调用,然后根据代码,它未被使用,因此 promise 和 then() 的参数都可以被回收。但是,如果您的 Promise 实现保留了某种已创建的 Promise 内部列表或表怎么办?也许解决后可以释放它们;也许永远不会。我的猜测是他们不会那样编写 Promise 实现。但没有证据。无论哪种方式,您的 JS 程序都无法区分。
    【解决方案3】:

    要查看一个对象是否可被垃圾回收,您可以创建一个测试并查找内存泄漏(通过任务管理器)。如果您的代码编写正确,所有内容都会被收集。

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多