NodeJS 缓冲区不是垃圾收集器

NodeJS Buffer is not Garbage Collected

我有一个 NodeJS 脚本,它生成 ffmpeg 和 ffplay,然后从输入的 ffmpeg 中获取帧,处理它们并将它们输出到另一个 ffmpeg 和 ffplay。它工作并以每秒约 3 帧的速度处理 1080p,但出于某种原因,它在将缓冲区写入输出后仍保留缓冲区。无论我是否使用集群 worker 都会发生这种情况,但如果我这样做,worker 也会开始使用大量内存。

它使用分代垃圾收集器。这意味着它将堆划分为多个区域并使用一组专门的算法来管理它们 - "nursery" 用于短期对象,这是大多数分配,一个或多个区域用于长期对象在托儿所幸存下来。

nursery使用了一种算法,其执行与存活对象的数量成正比,这意味着不为垃圾付出任何代价,但需要双倍的内存(在收集时,它只是放弃一半的内存并复制所有活动对象到另一个)。

旧区域使用标记和清除或标记和压缩,它们从根(全局引用、堆栈等)开始增量标记活动对象,同时程序正在执行和新的分配和更改指针正在发生(使用黑魔法)。最终它开始释放死对象,这意味着所有没有被标记的对象,也是递增的,为了不引起大的暂停(做出正确的观察,现在不需要所有空闲内存 - 只要它被释放比 space 的填充速度快。

以上内容来自此quora answer.

在某些情况下,当 V8 内存使用量达到 max-old-space-size 时,Node.js 垃圾收集 运行 秒。这是 V8 的堆内存限制(默认为 1.4GB 左右)。为了让我们能够帮助您,您应该 post 一些代码。这也有助于了解您 运行 的 Node.js 版本。

您可以 运行 您的脚本并将 max-old-space-size 设置为非常低的数字以确保 GC 实际上 运行s。如果它 运行s 那么你的代码没问题,你的问题是由 Node.js GC 优化引起的...