CentOS上Node.js内存管理优化策略
let/const替代var),并在不再需要时将其设置为null(如global.someData = null)。emitter.removeListener('event', handler)移除不再需要的监听器,用clearInterval(timer)/clearTimeout(timer)清除定时器。fs.readFileSync),改用fs.createReadStream()逐块读取,fs.createWriteStream()逐块写入,显著降低内存占用。Map/Set替代传统对象/数组(避免原型链查找开销),用ArrayBuffer处理二进制数据。--max-old-space-size参数调整老生代内存上限(单位:MB/GB),例如:node --max-old-space-size=4096 your_script.js # 设置为4GB
若使用PM2,可在ecosystem.config.js中配置:module.exports = {
apps: [{
name: 'your-app',
script: 'your_script.js',
max_memory_restart: '4G' // 内存超过4GB时自动重启
}]
};
/etc/sysctl.conf优化内存管理,减少Swap依赖:vm.swappiness=10 # 降低Swap使用倾向(0~100,值越小越倾向于使用物理内存)
vm.vfs_cache_pressure=50 # 控制内核回收用于目录和inode缓存的内存的倾向(值越大回收越积极)
应用更改:sysctl -p。ulimit -n 65535
永久生效需修改/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
```。
process.memoryUsage()方法获取进程内存使用情况(单位:字节),包括:
rss(Resident Set Size):进程占用的物理内存;heapTotal/heapUsed:堆内存的总分配量与已使用量;external:V8管理的C++对象内存(如Buffer)。setInterval(() => {
const mem = process.memoryUsage();
console.log(`RSS: ${(mem.rss / 1024 / 1024).toFixed(2)}MB, Heap Used: ${(mem.heapUsed / 1024 / 1024).toFixed(2)}MB`);
}, 5000);
```。
npm install heapdump,代码中调用:const heapdump = require('heapdump');
heapdump.writeSnapshot('/tmp/heapdump.heapsnapshot'); // 触发快照生成
node --inspect your_script.js启动调试模式,访问chrome://inspect,选择进程并进入“Memory”面板,进行堆快照、内存分配时间线分析。npm install memwatch-next,代码中监听leak事件:const memwatch = require('memwatch-next');
memwatch.on('leak', (info) => {
console.error('Memory leak detected:', info); // 输出泄漏信息(如增长的对象数量)
});
```。
node-cache或Redis缓存,但设置合理的过期时间(如ttl)或大小限制(如最大缓存条目数),避免缓存无限增长。cluster模式启动多进程(exec_mode: 'cluster'),或使用child_process创建子进程处理CPU密集型任务(避免阻塞事件循环)。