Node.js流管道和垃圾回收

问题描述 投票:3回答:1

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

背景:我试图了解管道对流对象生存期的影响。我的假设是,管道代表两个流之间的双向引用,因此,如果一个流可访问,则不会收集任何一个(当然,直到读者结束并且管道被关闭)。

因此假设:在管道处于活动状态时,或者在Readable上的“数据”侦听器正在执行等效操作时,运行时中是否有任何东西可以保留流? (除了嵌入事件侦听器函数和其他对象中的显而易见的引用之外)

一个具体示例是将文件读取流传递到http响应对象。如果我“一劳永逸”,并且不保留对文件或响应流的引用,此过程是否有可能在中途中断?

或者,如果某些东西阻碍了GC用于管道流,那么即使两个套接字都无法访问,两个套接字之间是否也会存在双向管道? (并且完全无法关闭?)

node.js stream garbage-collection pipe
1个回答
0
投票

答案通常是:取决于。

如果没有引用流对象的对象,则将对其进行垃圾回收。但是,可能在代码之外的地方都有引用。

请注意,可写流是由可读流引用的,所以我们真正需要的是对可读流的引用,以使两者都保持活动状态。

如果源是能够单独产生全部数据的流(它从文件,网络或内存中读取内容)并且管道正在流动,则它为由某个地方的回调引用(给setTimeout()process.nextTick()的I / O延续,事件处理程序或闭包)。

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

© www.soinside.com 2019 - 2024. All rights reserved.