Node.js中spawn子进程stdout引发内存占用持续飙升问题求助
Node.js spawn启动持续运行命令时内存持续攀升问题
现象描述
使用Node.js的spawn方法启动一个预期持续运行的命令(例如FFmpeg),该命令会持续向输出传输数据,但Node.js应用的内存占用会不断攀升,无法稳定下来。
可复现代码
空实现的data监听触发内存泄漏
const runCommand = () => { const command = 'FFMPEG COMMAND HERE'; let ffmpeg = spawn(command, [], { shell: true }); ffmpeg.on('exit', function(code) { code = null; }); ffmpeg.stderr.on('data', function (data) { data = null; }); ffmpeg.stdout.on('data', function (data) { data = null; }); };
将stdout管道到/dev/null仍无法解决
const runCommand = () => { const command = 'FFMPEG COMMAND HERE'; let ffmpeg = spawn(command, [], { shell: true }); ffmpeg.on('exit', function(code) { code = null; }); ffmpeg.stderr.on('data', function (data) { data = null; }); ffmpeg.on('spawn', function () { ffmpeg.stdout.pipe(fs.createWriteStream('/dev/null')); }); };
排查结论
- 移除
stdout的data事件监听函数后,内存增长问题完全消失 - 命令输出的数据为Buffer对象
- 问题根源与spawn输出流的背压机制相关:调整FFmpeg命令降低chunk发送频率后,内存增长速度有所减缓,但仍无法彻底阻止内存攀升
内容的提问来源于stack exchange,提问作者Soroush Bgm
相关产品推荐
相关产品推荐

