【原创】NodeJs内存泄漏分析工具

如何找出发生内存泄漏的地方?本文介绍和演示一些分析内存泄漏的工具,可以学习一下以备不时之需。

相关文章

  • 探索学习NodeJs内存管理
  • NodeJs内存泄漏示例学习
  • NodeJs内存泄漏分析工具

Easy-Monitor

安装

npm install easy-monitor

如果在windows系统下安装该工具,可能会出现如下报错:

MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”

需要在有管理员权限的控制台中安装windows-build-tools,如下:

npm install --global --production windows-build-tools

如果windows系统安装了phthon,需要先卸载python,再安装windows-build-tools

使用方式

测试代码如下,该代码会在每次访问localhost:3000的时候增加160M堆内存。

const easyMonitor = require('easy-monitor')
const http = require('http')

easyMonitor('test9')

let leakArray = []
let leak = function () {
  leakArray.push(new Array(10 * 1024 * 1024).fill(0))
}
http.createServer(function (req, res) {
  leak()
  res.writeHead(200, { 'Content-Type': 'text/plain' })
  res.end('Hello World\n')
}).listen(3000)

console.log('Server running at http://127.0.0.1:3000/')

使用node test9.js启动之后,打开localhsot:12333,界面如下:

首页

该工具支持cluster模块的多进程,可以选择某一进程查看实时数据。在解析类型一栏,先选中OS,点击start可以看到如下界面:

宏观内存使用情况一

可以清除的看到rssheapUsedheapTotal的变化。在访问一次localhost:3000后,观察图表的变化如下:

宏观内存使用情况二

从左到右的时间轴上,heapUsed增加了160M左右,刚好对应了每次请求申请160M堆内存,且不能释放。

多次访问localhost:3000地址后,发现内存占用大幅度上升,需要排查内存泄漏的具体地方,因此回到首页,选着MEM选项,进入界面如下:

内存分析详情页

界面中间的圆形图表是内存泄漏分析的结果,根据节点内存的占比来判断是否发生了内存泄漏,下面给出了可能发生泄漏的节点@98719,点击该节点,界面如下:

内存泄漏节点

图中黄色为内存泄漏根节点,绿色为泄漏链上的节点,蓝色为普通节点,鼠标悬停在节点上,可以看到节点所占内存。根据泄漏链和泄漏关键字,基本可以定位到具体的代码处了。

如果需要对周围的节点做进一步分析,可以回到内存分析详情页,以节点@98719为例,搜索该节点,可以看到更多相关节点的信息。

节点详细信息

该工具还提供了cpu的使用分析以及定制化部署,感兴趣的小伙伴可以去看下官方介绍:http://47.100.164.242/document/#/?id=easy-monitor-20

其他内存分析工具

  • heapdump + chrome devTools
  • memwatch
  • alinode

heapdumpmemwatch都可以获取堆内存快照,通过对快照进行分析定位发生内存泄漏的地方,但没有easy-monitor用起来方便直观,这里就不演示具体的用法了,可通过上面的链接了解学习。

alinode是阿里的部署node服务的平台,提供性能监控、安全提醒、故障排查、性能优化等,可以在线抓取GC Trace、堆快照、CPU Profile 等数据,有时间可以去试试。

本文参考资源如下

  • 深入浅出Node.js#第5章
  • http://taobaofed.org/blog/2016/04/16/how-to-find-memory-leak/
  • https://www.ctolib.com/topics-118921.html
  • https://www.cnblogs.com/youlechang123/p/6784337.html

你可能感兴趣的:(【原创】NodeJs内存泄漏分析工具)