首先需要明确是否存在内存泄漏。可通过以下方式监控内存使用趋势:
top、htop或vmstat命令,观察Node.js进程的RES(常驻内存)或%MEM(内存占比)是否随时间持续增长;process.memoryUsage(),定期打印内存使用情况(如heapUsed、heapTotal),若heapUsed持续上升且不回落,则可能存在泄漏;pm2启动应用(pm2 start app.js),通过pm2 monit查看内存实时变化,或通过pm2 logs查看是否有内存溢出(OOM)日志。定位泄漏源是解决问题的关键,常用工具和方法如下:
--inspect参数(如node --inspect app.js);chrome://inspect,找到目标Node.js进程并点击“inspect”;npm install heapdump,在代码中添加heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot')(如在setInterval中定期生成),生成快照后用Chrome DevTools分析;npm install memwatch-next,通过memwatch.on('leak', (info) => { console.log(info); })监控内存泄漏,触发时会输出泄漏信息(如增长的内存块数量)。根据定位到的泄漏源,针对性解决常见问题:
let/const声明局部变量,或通过模块导出/导入共享数据;removeListener(如emitter.removeListener('event', listener))或removeAllListeners;fs.readFile后调用file.close(),数据库连接调用connection.end());lru-cache库),避免缓存无限增长;或使用WeakMap/WeakSet存储缓存,允许GC自动回收无引用的对象。mocha+chai+sinon);pm2、New Relic等工具持续监控应用内存,设置内存阈值告警(如内存占用超过80%时触发告警);npm audit检查依赖漏洞)。通过以上步骤,可系统性地解决Ubuntu下JS(Node.js)应用的内存泄漏问题,提升应用稳定性和性能。