NodeJS Buffer不是Garbage Collected

时间:2017-01-04 19:19:36

标签: node.js garbage-collection buffer

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

它使用世代垃圾收集器。这意味着它将堆分成多个区域,并使用一堆专门的算法来管理它们 - 短期对象的“托儿所”,这是大多数分配,以及一个或多个区域,用于幸存的长寿命对象托儿所。

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

旧区使用标记&扫描或标记&紧凑,从根(全局引用,堆栈等)开始递增地标记活动对象,同时程序正在执行,并且正在发生新的分配和对指针的更改(使用黑魔法)。最终它开始释放死对象,意味着所有未被标记的对象,也是递增的,以便不会引起大的停顿(正确观察到现在不需要所有空闲内存 - 只要它被释放)比空间充满速度快。)

以上内容来自quora answer