发布于2026-07-05 阅读(0)
扫一扫,手机访问
在 Ubuntu 环境下跑 Node.js 应用,内存泄漏是个让人头疼的老问题——明明代码逻辑看起来没问题,可用上几天、几周,内存就蹭蹭往上涨,最后进程被系统强制杀掉。别慌,这类问题通常有套路可循,下面我们就按步骤来系统性排查和修复。
首先得确认,问题到底是真泄漏还是正常的内存波动。这里有几个实打实的监控手段:

top、htop 或者 vmstat 盯着 Node.js 进程的 RES(常驻内存)和 %MEM(内存占比)。如果数值持续走高,那就可疑了。process.memoryUsage(),定时打日志看看 heapUsed 和 heapTotal。如果 heapUsed 一直涨、不回落,基本就是泄漏没跑了。pm2 start app.js 启动应用,然后 pm2 monit 实时盯内存走势,或者 pm2 logs 排查有没有 OOM(内存溢出)日志。确定有泄漏之后,找“元凶”才是硬仗。常用的有两招:
--inspect 参数启动(比如 node --inspect app.js),然后打开 Chrome 浏览器,访问 chrome://inspect,找到对应的 Node 进程点“inspect”。切到“Memory”面板,点“Take heap snapshot”生成快照。重复操作,分别在泄漏前、泄漏后各拍一张,然后用“Comparison”功能对比——哪个对象数量或大小在持续增长?比如某些数组、对象一直不释放。点进去看“Retainers”(引用链),就能找到究竟是哪个全局变量、闭包或者事件监听器在“拽着”它不放。heapdump 库(npm install heapdump),在代码里定时调用 heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot'),生成快照后再用 Chrome DevTools 分析。另一个好用的是 memwatch-next(npm install memwatch-next),直接监听 memwatch.on('leak', (info) => { console.log(info); }),一旦检测到泄漏就会输出信息,比如增长的内存块数量,省去手动对比的折腾。找到泄漏点之后,对症下药。常见问题及修复方式如下:
let/const 声明局部变量,如果非要共享数据,走模块导出/导入,别挂在全局上。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 检查依赖漏洞,同时更新第三方库——很多老版本里就藏着已知的内存泄漏 bug。按照这套流程一步步走下来,Ubuntu 下 Node.js 应用的内存泄漏问题基本都能搞定。记住,关键是先确认、再定位、然后修复、最后预防,形成闭环,应用稳定性自然就上来了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8