如何在Ubuntu上优化Node.js内存使用
Node.js默认使用V8引擎的内存限制(32位系统约512MB,64位系统约1GB),可通过--max-old-space-size参数扩大老生代内存(堆内存的主要部分)。例如,将内存限制提升至4GB:
node --max-old-space-size=4096 your_script.js
或在package.json的启动脚本中配置(推荐,避免每次手动输入):
"scripts": {
"start": "NODE_OPTIONS='--max-old-space-size=4096' node server.js"
}
此方法适用于内存需求较大的应用,但需结合代码优化,避免过度依赖内存扩容。
let/const声明局部变量,并在不再需要时将其设为null(如globalVar = null)。fs.createReadStream()、http.get()等流API逐块处理文件或网络数据,而非一次性加载到内存。例如:const fs = require('fs');
const readStream = fs.createReadStream('largeFile.txt', { encoding: 'utf8' });
readStream.on('data', (chunk) => { /* 处理数据块 */ });
Map替代Object处理键值对),避免嵌套过深的对象;优先使用时间复杂度低的算法(如快速排序替代冒泡排序)。Array.slice()分割数组),减少单次操作的内存占用。例如:function processBatch(data, batchSize = 100) {
for (let i = 0; i < data.length; i += batchSize) {
const batch = data.slice(i, i + batchSize);
// 处理当前批次
}
}
node-cache库),但需设置缓存过期时间(TTL)或最大容量,避免缓存无限增长。pm2 monit命令查看实时内存)、限制单个进程的内存(--max-memory-restart参数)。例如:pm2 start server.js --max-memory-restart 512M # 内存超过512MB时自动重启
安装PM2:npm install pm2 -g。内存泄漏是导致内存使用持续增长的主要原因,需通过以下步骤定位和修复:
process.memoryUsage()定期打印内存使用情况(如每5秒打印一次),观察heapUsed(堆内存使用量)是否持续增长:setInterval(() => {
const memory = process.memoryUsage();
console.log(`Heap Used: ${(memory.heapUsed / 1024 / 1024).toFixed(2)}MB`);
}, 5000);
heapdump模块生成堆内存快照(.heapsnapshot文件),通过Chrome DevTools分析内存中的对象引用链,找出泄漏源(如未被释放的全局变量、闭包引用的对象)。安装与使用:npm install heapdump --save
在代码中添加快照生成逻辑(如内存增长过快时触发):const heapdump = require('heapdump');
heapdump.writeSnapshot('/tmp/snapshot_' + Date.now() + '.heapsnapshot');
var声明变量(会挂载到global对象),使用let/const替代;removeListener或off中移除不再需要的监听器(如socket.on('data', callback)需对应socket.off('data', callback));async库的limit方法(如async.queue)或p-limit库限制并发数量(如最多同时处理10个请求)。lodash-es替代lodash,前者支持Tree Shaking,减少打包体积)。sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
永久生效需将/swapfile none swap sw 0 0添加到/etc/fstab文件中。