如何找出发生内存泄漏的地方?本文介绍和演示一些分析内存泄漏的工具,可以学习一下以备不时之需。
相关文章
- 探索学习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
可以看到如下界面:
可以清除的看到rss
、heapUsed
、heapTotal
的变化。在访问一次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
heapdump
与memwatch
都可以获取堆内存快照,通过对快照进行分析定位发生内存泄漏的地方,但没有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