这个功能可以被垃圾收集吗?

时间:2015-03-30 08:38:05

标签: javascript node.js garbage-collection v8

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

'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()垃圾收集?
  3. 我的猜测是doMoreWork()不能直接进行GC编辑,因为Promise会保留对它的引用,但是一旦promise的主体完成并将执行上下文返回到上层(?)范围,堆栈就会展开(因为这里没有更多的陈述可以执行)而且Promise变得无法到达,因此可以被垃圾收集。

    您能否确认我对此主题的理解是否正确?

    我怎样才能凭经验观察到这种行为?换句话说,我该如何监控GC-ed的对象以及何时?我完全在Node.js中开发,如果这有任何区别的话。

3 个答案:

答案 0 :(得分:3)

没有什么可以保留对诺言的引用,因此它将被垃圾收集。承诺是唯一保留对函数doMoreWork的引用,因此它也将被垃圾收集。

  

我怎么能凭经验观察这种行为?换句话说,我如何监控哪些对象正在进行GC编辑?何时?我纯粹在Node.js中开发,如果这有任何区别。

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

答案 1 :(得分:0)

  1. 如果Promise对象没有指向它的引用,则它是可收集的。 如果使用doWork().then(...),则会创建临时引用。因此,在.then不再阻止之前,会有对该对象的引用,因此无法收集它
  2. 你是对的,doMoreWork也不可收集,因为Promise对象有一个对它的引用
  3. 语句doWork().then(...)可以替换为

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

    所以你可以想象你直接使用Promise对象,所以" Upper" -Scope是使用对象的地方。

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

答案 2 :(得分:0)

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