要解决内存泄漏,首先需要确认泄漏存在并定位泄漏趋势。常用方法如下:
process.memoryUsage()监控:通过Node.js内置方法定期输出内存使用情况(RSS、堆内存等),若内存持续增长且不回落,可能存在泄漏。例如:setInterval(() => {
const { rss, heapUsed } = process.memoryUsage();
console.log(`RSS: ${(rss / 1024 / 1024).toFixed(2)}MB, HeapUsed: ${(heapUsed / 1024 / 1024).toFixed(2)}MB`);
}, 1000);
node-memwatch或heapdump库,前者可在检测到泄漏时触发回调,后者用于生成堆快照。安装与使用示例:npm install node-memwatch heapdump
const memwatch = require('node-memwatch');
memwatch.on('leak', (info) => console.error('Memory leak detected:', info));
const heapdump = require('heapdump');
heapdump.writeSnapshot('/tmp/snapshot.heapsnapshot'); // 手动生成快照
定位到泄漏后,需通过堆快照对比找出未被释放的对象及引用链:
heapdump模块在不同时间点生成快照(如泄漏前、泄漏后),或通过Chrome DevTools的Memory面板直接捕获。v8-profiler生成支配树,分析内存占用的主要来源;或使用MAT(Memory Analyzer Tool)进一步定位泄漏点。根据分析结果,针对性修复以下常见泄漏原因:
let/const声明局部变量。null)。removeEventListener移除事件监听器(如EventEmitter的监听器)。lru-cache等模块设置缓存有效期和最大容量,避免缓存无限增长。setInterval/setTimeout(如使用clearInterval)。stream.destroy()或监听end/close事件释放资源。--max-old-space-size参数增加老生代内存限制(如node --max-old-space-size=8192 app.js),避免因内存不足触发崩溃;使用PM2等进程管理器自动重启进程、监控内存使用。free -m查看交换空间,必要时使用swapon增加交换空间;关闭不必要的系统服务,释放内存资源。global.gc()手动触发垃圾回收(需启动时添加--expose-gc参数);调整V8垃圾回收参数(如vm.swappiness)优化回收效率。