这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
这是内存控制章节的最后一篇文章,内存泄漏的排查
- 第一篇:V8 的内存限制和原因
- 第二篇:V8 的垃圾回收机制
- 第三篇:高效使用内存
- 第四篇:内存指标
- 第五篇:内存泄漏的原因和解决方式
上一篇文章讲到内存泄漏的原因和解决方式,一是把内存当作缓存,缓存对象会常驻在老生代中,需要限制缓存对象key的个数,可以使用 LRU 算法,或者使用外部缓存比如 Redis;二是在生产者-消费者模型中,如果生产的速度远大于消费,会造成内存泄漏,需要设置超时报警,或者采用拒绝模式。
内存泄漏的排查,本文介绍工具:node-heapdump
node-heapdump
我们按照步骤试用下 node-heapdump:
首先初始化一个测试项目
mkdir test_memory_leak
cd test_memory_leak
npm init
...
touch index.js
准备测试代码,我们在每次访问 http://127.0.0.1:1337/ 的时候,都会向 leakArray 数组中 push 元素,且内存不会被释放
var http = require('http');
var leakArray = [];
var leak = function () {
leakArray.push("leak" + Math.random());
};
http.createServer(function (req, res) {
leak();
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337);
console.log('Server running at http://127.0.0.1:1337/');
console.log(process.pid);
安装 node-heapdump
npm i heapdump
在 index.js 第一行增加
var heapdump = require('heapdump');
使用 ab(Apache Bench)工具重复请求我们的地址,造成内存泄漏
ab -n 3000 http://127.0.0.1:1337/
通过向服务进程发送 SIGUSR2 信号,让 node-heapdump 抓取内存快照,其中 pid 已经通过 process.pid 打印
kill -USR2 <pid>
这份快照会在项目的目录下以 heapdump-..heapsnapshot 格式存放,这是一个较大的 json 文件,需要通过 chrome 开发者工具查看
进入 memory,在左侧右键选择 Load
选择刚才生成的文件
可以看到有大量未被回收的,leak 字符串
通过 leak 字符串常驻内存,可以排查内存泄漏的问题
以上是内存泄漏排查方式 node-heapdump 的使用,欢迎点赞的评论~