1. 使用 process.memoryUsage()
实时监控内存使用基础信息
- 实现步骤:
- 在Node.js应用的关键位置,比如主程序入口或者性能敏感的函数内部,周期性调用
process.memoryUsage()
方法。
- 将返回的内存使用信息记录下来,以便后续分析。
- 关键代码逻辑:
setInterval(() => {
const memoryUsage = process.memoryUsage();
console.log(`RSS: ${memoryUsage.rss} bytes`);
console.log(`Heap Total: ${memoryUsage.heapTotal} bytes`);
console.log(`Heap Used: ${memoryUsage.heapUsed} bytes`);
}, 5000);
- 上述代码使用 `setInterval` 每5秒打印一次内存使用信息。`rss` 是进程的常驻集大小(resident set size),表示进程在内存中占用的总字节数。`heapTotal` 和 `heapUsed` 分别表示V8堆的总大小和已使用大小。
2. 结合 heapdump
第三方工具定位内存泄漏源头
- 安装
heapdump
:
- 在项目目录下执行
npm install heapdump
安装该工具。
- 实现步骤:
- 在应用启动时,设置一个用于触发堆快照的机制,比如通过HTTP接口或者特定信号。
- 当检测到内存使用异常(通过
process.memoryUsage()
监控发现 heapUsed
持续增长等情况)时,触发堆快照。
- 分析堆快照文件,找出引用链过长或者存在循环引用的对象,这些可能是内存泄漏的源头。
- 关键代码逻辑:
const http = require('http');
const heapdump = require('heapdump');
http.createServer((req, res) => {
if (req.url === '/dump') {
heapdump.writeSnapshot((err, filename) => {
if (err) {
console.error('Error writing heap snapshot:', err);
res.statusCode = 500;
res.end('Error writing heap snapshot');
} else {
console.log('Heap snapshot written to:', filename);
res.statusCode = 200;
res.end('Heap snapshot written successfully');
}
});
} else {
res.statusCode = 404;
res.end('Not Found');
}
}).listen(3000, () => {
console.log('Server running on port 3000');
});
- 上述代码创建了一个简单的HTTP服务器,当访问 `/dump` 路径时,使用 `heapdump.writeSnapshot` 方法生成堆快照文件。生成的堆快照文件可以使用Chrome DevTools等工具打开分析,在 `Profiles` 标签页中加载快照文件,通过查看对象的保留大小(Retained Size)和引用关系来定位内存泄漏的对象。