在 Linux 系统中优化 Node.js 内存,需要从 代码、运行时参数、系统层面、监控与诊断 多个角度入手。下面给你一套比较实用的优化思路。
Node.js(V8 引擎)内存主要分为:
默认情况下:
可通过环境变量或启动参数调整。
--max-old-space-size 调整老生代内存node --max-old-space-size=4096 app.js
单位:MB
常见设置:
2048 ~ 40964096 ~ 81921024⚠️ 不是越大越好,过大可能增加 GC 停顿。
node --max-semi-space-size=256 app.js
适用于大量短生命周期对象的场景(如高并发请求)。
✅ 常见内存泄漏点:
global.cache = data; // ❌
function outer() {
const big = new Array(1e6);
return () => big; // big 被一直引用
}
setInterval(() => {}, 1000); // ❌
emitter.on('data', handler);
// 用完要
emitter.off('data', handler);
❌ 不推荐:
const copy = JSON.parse(JSON.stringify(obj));
✅ 推荐:
structuredClone(Node 17+)❌ 一次性加载:
fs.readFileSync('big.json');
✅ 使用 Stream:
fs.createReadStream('big.json').pipe(res);
✅ 使用 async iterator:
for await (const chunk of stream) {}
Buffer.allocUnsafe 时注意安全buffer = null使用 systemd 或 docker:
# systemd
MemoryMax=2G
Docker:
docker run -m 2g node:18 app.js
ulimit -v # 查看虚拟内存限制
容器建议:
swapon -s
⚠️ swap 会增加 GC 延迟,不建议高性能服务。
node --trace-gc app.js
node --trace-gc-verbose app.js
用于判断:
node --inspect app.js
然后用 Chrome DevTools:
node --max-old-space-size=4096 \
--max-semi-space-size=128 \
app.js
配合:
pm2 start app.js --max-memory-restart 2G
PM2 会在内存超限时自动重启。
如果内存持续增长:
heap snapshot 对比两次快照Node.js 内存优化 = 合理分配内存 + 避免泄漏 + 减少大对象 + 流式处理 + 结合系统限制
如果你愿意,可以告诉我:
我可以给你更针对性的优化方案和参数模板。