2 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果您使用的是 UN*Xy 操作系統(tǒng),則刪除的文件將繼續(xù)存在,直到所有打開(kāi)的文件描述符都關(guān)閉。它存在,但沒(méi)有名字。
“如果指向的文件被移動(dòng)或刪除,Linux 上打開(kāi)的文件句柄會(huì)發(fā)生什么”給出了 Linux 的詳細(xì)信息。

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
我認(rèn)為一般的答案是 JS 只是將寫(xiě)入數(shù)據(jù)塊保留在堆中,并在其垃圾收集機(jī)制下在適當(dāng)?shù)臅r(shí)候釋放它們。
寫(xiě)入數(shù)據(jù)塊可能是一種類(lèi)型<string> | <Buffer> | <Uint8Array> ...
,也許你想看看 API Buffer.allocUnsafeSlow(size),它提到:
當(dāng)使用 Buffer.allocUnsafe() 分配新的 Buffer 實(shí)例時(shí),4KB 以下的分配是從單個(gè)預(yù)分配的 Buffer 中切片的。這允許應(yīng)用程序避免創(chuàng)建許多單獨(dú)分配的 Buffer 實(shí)例的垃圾收集開(kāi)銷(xiāo)。
根據(jù)這一段,您可以通過(guò)另一個(gè)方法Buffer.alloc()在 Node 引擎的垃圾收集下推斷為Buffer(這是我上面提到的類(lèi)型之一)分配內(nèi)存。
JS Object 的內(nèi)存處理在堆中。createStream
必須先打開(kāi)dest文件的數(shù)據(jù)并將其加載到堆/內(nèi)存中,即使是這樣的方法,writeStream.write()
也不是直接對(duì)文件/磁盤(pán)做I/O,它必須在內(nèi)存中逐塊處理數(shù)據(jù)首先,然后用最少的次數(shù)將其寫(xiě)入磁盤(pán),所以當(dāng)dest文件沒(méi)有了時(shí),可能這種方法的做法只是將這些數(shù)據(jù)塊保留在堆中,然后看看什么時(shí)候釋放它們的好時(shí)機(jī)。
與dest文件仍然存在的情況相比,我認(rèn)為沒(méi)有太大區(qū)別,它最終會(huì)為那些數(shù)據(jù)清理內(nèi)存。
如果您想了解更多關(guān)于 Node 引擎中的垃圾收集:a-tour-of-v8-garbage-collection
添加回答
舉報(bào)