1. 代码层面优化:减少内存占用与泄漏风险
fs.createReadStream()逐块读取数据,显著降低内存峰值。例如,处理大型日志文件时,用readStream.on('data', callback)逐块处理,而非fs.readFileSync()。null(如let data = getLargeData(); processData(data); data = null;)。Set代替数组进行快速查找,减少遍历开销);对频繁访问的数据使用缓存(如node-cache库),并设置合理的过期时间(如myCache.set('key', 'value', 60000)表示缓存1分钟),避免缓存无限增长。fs.promises.readFile()、async/await等异步API,避免同步操作阻塞事件循环,确保Node.js的高并发性能。同时,控制异步并发量(如用p-limit库限制同时进行的请求数),防止资源耗尽。2. 内存分析与泄漏检测:定位问题根源
process.memoryUsage()定期输出内存指标(rss:常驻内存;heapTotal:堆总内存;heapUsed:已用堆内存;external:C++对象内存),观察内存是否持续增长(如每秒打印一次,若heapUsed持续上升则可能存在泄漏)。也可使用node-memwatch库,通过memwatch.on('leak', callback)监听内存泄漏事件。heapdump库生成堆转储文件(heapdump.writeSnapshot('/tmp/snapshot.heapsnapshot')),通过Chrome DevTools的Memory面板加载快照,对比不同时间点的堆内存,找出未被释放的对象(如未移除的事件监听器、闭包中的长期引用)。此外,clinic.js工具(clinic memory -- node app.js)可自动化分析内存泄漏,生成可视化报告。global的对象)、未移除的事件监听器(如emitter.on('event', handler)未调用emitter.removeListener)、定时器未清除(如setInterval未用clearInterval停止)、闭包中的长期引用(如返回的函数引用了外部的大数组,需手动置空)。3. 垃圾回收(GC)优化:主动释放无用内存
--max-old-space-size参数增大Node.js的堆内存上限(如node --max-old-space-size=4096 app.js设置为4GB),避免因内存不足导致进程崩溃。适用于内存需求大的应用(如处理大型JSON文件的后端服务)。--expose-gc参数(node --expose-gc app.js),在代码中适时调用global.gc()强制回收内存(如每天凌晨业务低峰期执行)。注意:频繁手动GC可能影响性能,仅用于调试或特定场景。--gc_interval=1000设置GC间隔为1秒,--max-semi-space-size=1024设置新生代内存上限为1GB),但需根据应用实际情况测试,避免过度优化。4. 系统与进程管理:提升整体稳定性
PM2管理Node.js进程,实现自动重启(如进程崩溃时自动恢复)、内存监控(pm2 monit查看实时内存)、集群模式(多核CPU上运行多个进程,提升吞吐量)。例如,pm2 start app.js --max-memory-restart 2G表示内存超过2GB时自动重启。free -m查看交换空间使用情况,若物理内存不足,用swapon /swapfile启用交换空间(需提前创建,如dd if=/dev/zero of=/swapfile bs=1M count=2048创建2GB交换文件)。交换空间可作为内存扩展,避免因内存耗尽导致进程被杀死,但会增加磁盘IO,影响性能。systemctl list-unit-files --type=service列出所有服务,禁用不需要的服务(如systemctl disable bluetooth),释放系统资源,减少对Node.js应用的内存竞争。