Node.js流管道和垃圾收集

时间:2016-12-22 02:25:25

标签: node.js stream garbage-collection pipe

问题: 在Node.js中,如果将可读流传送到可写流并且两者都超出范围,那么在读取器完成之前,这对流是否可能被垃圾收集? (因为它们现在无法访问)

背景 我试图了解管道对流对象生命周期的影响。我在假设管道代表两个流之间的双向引用的情况下运行,因此如果一个可访问,则不会进行垃圾收集(当然,直到读取器结束并且管道关闭)。

因此,假设:在管道处于活动状态时,或者在“数据”数据的同时,运行时内是否有任何内容存在流。 Readable上的监听器是做同等的吗? (除了显而易见的,类似于事件监听器函数和其他对象中嵌入的引用)

一个具体示例是将文件读取流传输到http响应对象。如果我"管道忘了",并且不保留对文件或响应流的引用,这个过程是否可能在流中断?

或者,如果某些内容阻止了GC用于管道流,那么两个套接字之间的双向管道是否会无限期地存在,即使它们都不可访问? (并且完全无法解决?)

1 个答案:

答案 0 :(得分:1)

答案通常是:取决于。

如果没有任何内容引用流对象,则将对其进行垃圾回收。但是,您的代码中可能还有其他地方的引用。

请注意,可写流是通过事件处理程序由可读流引用的,因此我们真正需要的是对可读流的引用,以使两者均保持活动状态。

如果源是能够自行产生数据的流(它从文件,网络或内存中的某些内容读取),并且流水线正在流动,则它将被某处的回调引用(I / O延续,事件处理程序或为setTimeout()process.nextTick()提供的闭包)。

如果源是正在等待您将数据推入其中的流,或者管道已暂停,则可能没有引用,并且两个流最终都将被垃圾回收。