← 中文资源

简体中文版本

Node.js worker_threads 的 ERR_WORKER_OUT_OF_MEMORY

诊断 Node worker 线程超出 resourceLimits 时的 ERR_WORKER_OUT_OF_MEMORY,并通过调整堆上限或缩减工作量来修复。

阅读英文原文

症状

worker 线程因 ERR_WORKER_OUT_OF_MEMORY 而退出,退出码为 1,但父进程仍继续运行。对于大负载该失败可稳定复现,小负载则正常。

诊断

检查配置的上限与实际需求:

const worker = new Worker('./job.js', {
  resourceLimits: { maxOldGenerationSizeMb: 128 },
});
worker.on('exit', (code) => console.error('worker exit', code));

在 worker 内部拍取堆快照并对比其保留大小,找出无界增长的对象。

修复

将上限调高到与任务匹配,或更好的做法是改为流式输入、增量处理:

for await (const chunk of stream) {
  process(chunk); // do not retain chunk
}

在大任务之间重建 worker,避免堆状态累积。

验证

用相同负载重跑,确认 worker 正常完成并以 0 退出。再做一次堆跟踪,应看到受控的峰值而非持续爬升的基线。