内存泄漏是 Node.js 应用中常见的问题,会导致应用内存使用量持续增长,最终可能引发进程崩溃。以下是系统性的排查方法:
首先确认是否存在内存泄漏:
- 监控进程内存使用量(process.memoryUsage()
)
- 使用操作系统工具(如 top
, htop
, pm2 monit
)
- 观察 GC 行为(--trace-gc
标志)
# 生成堆快照
node --inspect your-app.js
# 然后通过 Chrome DevTools 获取堆快照
# 或者直接生成堆转储
kill -USR2 <pid> # 生成堆转储到 /tmp/ 目录
node --inspect --trace-gc --trace-gc-verbose your-app.js
--inspect
标志chrome://inspect
npm install -g clinic
clinic doctor -- node your-app.js
const heapdump = require('heapdump');
// 手动触发堆转储
heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot');
var
/let
/const
)setInterval
未清除--max-old-space-size
限制内存使用// 内存监控中间件
app.use((req, res, next) => {
const mem = process.memoryUsage();
console.log(`Memory: ${Math.round(mem.heapUsed / 1024 / 1024)}MB`);
next();
});
// 强制GC(仅用于测试)
if (global.gc) {
setInterval(() => {
global.gc();
console.log('Manual GC');
}, 30000);
}
通过以上方法,您可以系统地排查和解决 Node.js 应用中的内存泄漏问题。