在Ubuntu上优化Node.js内存使用的实践指南
Node.js默认的V8内存限制(约1.4GB~2GB)可能无法满足大型应用需求,可通过--max-old-space-size参数扩展堆内存。例如,将内存上限设置为4GB:
node --max-old-space-size=4096 your_script.js
此参数需根据服务器物理内存调整(建议不超过物理内存的70%),避免过度占用导致系统卡顿。
fs.createReadStream()逐块读取:const fs = require('fs');
const readStream = fs.createReadStream('largeFile.txt', { encoding: 'utf8' });
readStream.on('data', (chunk) => { /* 处理数据块 */ });
null(如let data = getData(); data = null;)。node-cache库),但需设置过期时间或最大容量(如new NodeCache({ stdTTL: 3600, maxKeys: 1000 })),避免缓存无限增长。top或htop命令监控Node.js进程的内存占用(按M键按内存排序),快速识别异常进程。process.memoryUsage()输出内存详情(单位:字节),包括:
rss(常驻内存集):进程占用的物理内存;heapUsed/heapTotal:V8堆内存的使用/总容量;external:C++对象占用的内存(如Buffer)。setInterval(() => {
const memory = process.memoryUsage();
console.log(`RSS: ${(memory.rss / 1024 / 1024).toFixed(2)}MB, Heap: ${(memory.heapUsed / 1024 / 1024).toFixed(2)}/${(memory.heapTotal / 1024 / 1024).toFixed(2)}MB`);
}, 5000);
pm2 start app.js --watch --max-memory-restart 512M
通过pm2 monit命令实时查看内存、CPU等指标。heapdump模块生成堆内存快照,通过Chrome DevTools对比不同时间点的快照,找出持续增长的对象(如未释放的全局变量、闭包引用的对象)。npm install heapdump
代码中触发快照:const heapdump = require('heapdump');
heapdump.writeSnapshot('/tmp/snapshot_' + Date.now() + '.heapsnapshot');
global对象,使用let/const声明局部变量;emitter.removeListener()移除监听器;clearInterval(timer)或clearTimeout(timer)清理不再需要的定时器。sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab # 开机自动挂载