Node.js 流管道和垃圾收集

标签 node.js stream garbage-collection pipe

问题:
在 Node.js 中,如果一个 Readable 流通过管道传输到一个 Writable 流并且都超出范围,那么这对流是否容易在读取器完成之前被垃圾收集? (因为他们现在无法访问)

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

所以有了这个假设:当管道处于事件状态时,或者当 Readable 上的“数据”监听器正在执行等效操作时,运行时中是否有任何东西可以保持流的存在? (除了显而易见的,比如嵌入在事件监听器函数和其他对象中的引用)

一个具体的例子是将文件读取流通过管道传输到 http 响应对象。如果我“一劳永逸”,并且不保留对文件或响应流的引用,这个过程是否容易在中途中断?

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

最佳答案

像往常一样,答案是:视情况而定。

如果没有引用流对象,那么它们将被垃圾收集。但是,除了您的代码之外,其他地方可能还有引用。

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

如果源是一个能够自己生成数据的流(它从文件、网络或内存中的某些东西读取)并且管道正在流动,那么它将被某个地方的回调引用(一个 I/O给予 setTimeout()process.nextTick() 的延续、事件处理程序或闭包)。

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

关于Node.js 流管道和垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41274906/

相关文章:

javascript - Socket.io 分别与每个用户合作

c++ - 将字符串变量放入 system() 时出错

node.js - 语法错误 : Unexpected token import - Express

node.js - 使用 node.js 登录 Firebase-Admin

ios - QuickTime Player(或实际上是 CoreMedia)在播放 HTTP 流时如何工作?

java - 如何在 Java 中重构关闭流?

garbage-collection - Gambit-C 的 GC 机制是什么?

java - 您如何看待 Sonar 的不良做法 - Finalizer 仅将字段设为空?

java - 为什么有两个运行线程而不是一个?

javascript - Angular - 选择时出错 - NgFor 仅支持绑定(bind)到 Iterables,例如数组