我有一个产生子进程的方法,该子进程具有事件侦听器及其内部的处理程序。
我的问题是:
垃圾回收会清除方法上下文,还是将其保留在内存中直到整个应用程序存在
import { spawn } from 'child_process';
class SomeThing {
initChildProcess() {
const childProcess = spawn('go', [ 'run', 'awesome.go' ])
// what will happen to this context
// will garbage collector clear it?
childProcess.once('close', () => {
// when I re-invoked it inside this event handler?
this.initChildProcess()
})
}
}
答案 0 :(得分:1)
使用您显示的代码,一旦您对this.initChildProcess()
的内部调用返回(由于spawn()
是异步的,所以很快),那么您对initChildProcess()
的原始调用就完成了,该调用中的childProcess
对象将处于关闭状态,并且没有其他事件侦听器(或可能发生的事件),因此可以进行垃圾收集。
当我重新调用内部事件处理程序中的方法时,方法上下文(内存)会发生什么?
有关垃圾收集的条件,请参见上文。显示的内容将被垃圾收集。重新调用与与原始调用关联的上下文没有任何关系。
垃圾回收会清除方法上下文,还是将其保留在内存中直到整个应用程序存在
它将清除它。 spawn()
的第二次调用没有对第一个调用的代码引用,因此,第一个spawn()
后面的本机代码完成后或没有更多事件时,第一个将有资格进行垃圾回收第一个childProcess
对象上的侦听器。这将使childProcess
对象无法被任何代码访问,因此有资格进行垃圾回收。