Node.js默认的V8引擎内存限制(约1.4GB/32位、2GB/64位)可能不足以应对大型应用或大数据处理。通过调整--max-old-space-size参数可扩大堆内存上限:
node --max-old-space-size=4096 your-app.js(将内存限制设为4GB)。scripts字段中为目标命令添加参数,例如:"scripts": {
"start": "NODE_OPTIONS='--max-old-space-size=4096' node app.js",
"dev": "cross-env NODE_OPTIONS='--max-old-space-size=4096' nodemon app.js"
}
(使用cross-env可解决跨平台环境变量问题,需提前安装:npm install -g cross-env)内存泄漏是导致内存溢出的常见原因(如未释放的闭包、全局变量、缓存未清理、事件监听器堆积)。以下是具体排查与修复步骤:
Heapdump模块记录内存状态,在代码中添加:const heapdump = require('heapdump');
// 在关键位置(如接口入口、定时任务)生成快照
heapdump.writeSnapshot('/tmp/heap-${Date.now()}.heapsnapshot');
或通过--inspect参数启动应用,用Chrome DevTools的Memory面板捕获快照。global对象(如global.cache = {}),改用局部变量或模块级变量;node-cache库的ttl参数),或定期清空缓存;emitter.removeListener);setTimeout(() => { /* 避免引用大对象 */ }, 1000))。fs.createReadStream、xlsx.createReadStream)或分页查询(如Sequelize的offset/limit):// 流式读取Excel文件
const stream = fs.createReadStream('large.xlsx');
const workbook = XLSX.stream.to_json(stream);
workbook.on('data', (row) => { /* 处理单行数据 */ });
workbook.on('end', () => { console.log('处理完成'); });
Map代替Object(当键为复杂类型时更高效),避免不必要的对象嵌套(如扁平化数据结构)。pm2 monit),并设置内存阈值自动重启:pm2 start app.js --max-memory-restart 4G # 内存超过4GB时自动重启
app.use((req, res, next) => {
const memory = process.memoryUsage();
console.log(`[${new Date().toISOString()}] RSS: ${(memory.rss / 1024 / 1024).toFixed(2)}MB`);
next();
});
top、htop命令查看进程内存占用,或通过vmstat监控系统内存使用趋势。sudo fallocate -l 2G /swapfile # 创建2GB交换文件
sudo chmod 600 /swapfile # 设置权限
sudo mkswap /swapfile # 格式化为交换空间
sudo swapon /swapfile # 启用交换空间
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab # 开机自动启用
通过以上方法,可有效解决Ubuntu系统下Node.js的内存溢出问题。需根据具体场景(如是否频繁崩溃、是否有内存泄漏)选择合适的方案,优先排查内存泄漏(根本原因),再结合内存限制调整与代码优化提升应用稳定性。