【8.19】nodejs原理学习-内存控制(6)-

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

这是内存控制章节的最后一篇文章,内存泄漏的排查

上一篇文章讲到内存泄漏的原因和解决方式,一是把内存当作缓存,缓存对象会常驻在老生代中,需要限制缓存对象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

image.png
选择刚才生成的文件

image.png

可以看到有大量未被回收的,leak 字符串

image.png

通过 leak 字符串常驻内存,可以排查内存泄漏的问题

以上是内存泄漏排查方式 node-heapdump 的使用,欢迎点赞的评论~