当您删除由 nodejs 中的 fs 模块作为 writeStream 打开的文件时会发生什么?

我正在下载一些文件并将其写入一个以 writeStream 打开的文件,但是当我尝试删除它时,它被删除了,但 fs 仍在做它的工作,但无处可写......那个缓冲区去哪儿了?当我删除它正在写入的那个文件时



千万里不及你
浏览 103回答 2
2回答

一只甜甜圈

如果您使用的是 UN*Xy 操作系统,则删除的文件将继续存在,直到所有打开的文件描述符都关闭。它存在,但没有名字。“如果指向的文件被移动或删除,Linux 上打开的文件句柄会发生什么”给出了 Linux 的详细信息。

胡子哥哥

我认为一般的答案是 JS 只是将写入数据块保留在堆中,并在其垃圾收集机制下在适当的时候释放它们。写入数据块可能是一种类型<string> | <Buffer> | <Uint8Array> ...,也许你想看看 API&nbsp;Buffer.allocUnsafeSlow(size),它提到:当使用 Buffer.allocUnsafe() 分配新的 Buffer 实例时,4KB 以下的分配是从单个预分配的 Buffer 中切片的。这允许应用程序避免创建许多单独分配的 Buffer 实例的垃圾收集开销。根据这一段,您可以通过另一个方法Buffer.alloc()在 Node 引擎的垃圾收集下推断为Buffer(这是我上面提到的类型之一)分配内存。JS Object 的内存处理在堆中。createStream必须先打开dest文件的数据并将其加载到堆/内存中,即使是这样的方法,writeStream.write()也不是直接对文件/磁盘做I/O,它必须在内存中逐块处理数据首先,然后用最少的次数将其写入磁盘,所以当dest文件没有了时,可能这种方法的做法只是将这些数据块保留在堆中,然后看看什么时候释放它们的好时机。与dest文件仍然存在的情况相比,我认为没有太大区别,它最终会为那些数据清理内存。如果您想了解更多关于 Node 引擎中的垃圾收集:a-tour-of-v8-garbage-collection
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript