作为一个刚入公司的应届生,跟着大牛做Webapp开发(新人)语言使用react-redux开发,公司要求必须有内存泄漏的自动化报告,于是就将这个任务指派给了我去寻找合适的工具。
客户要求必须要自动化检测是指运行webapp时的,内存泄露而并非单体测试时的内训泄露(实际上单体测试内存泄漏也没有任何实际意义),这里我理解的内存泄露检测原理:运行webapp后(chrome),重复进行指定操作,完成后使用一次GC,理论上如果没有内训泄露,GC之后的内存使用率应该和一开始的内存使用率相差不大。
首先在优快云上寻找工具,不过遗憾的是,JS的内存泄露工具少之又少,IEJSLeaksDetector等,这些工具都已过时,不能用于运行检测.
首先求助stackoverflow,很多人建议我直接使用chrome自带的DevTools-memory进行内存泄漏检查,这也是目前大多是开发者使用的方法,但是这却不符合客户的要求,只能作为下策。
在github上发现了一堆工具:
1.https://github.com/andywer/leakage,Leakage(我的理解)此工具只能查询单体测试中的内存泄漏,且需要写测试代码,并不能保证Webapp运行中整体不发生内存泄漏,显然不符合要求。
2.https://github.com/Doist/JavaScript-memory-leak-checker ,memory-leak-checker,这个工具过于简单,是一个浏览器脚本,在webapp运行的时候启动它,但是它只能检测出内存占用较大的类,某些对象是不需要检测的-PASS。
3.https://github.com/airbnb/node-memwatch ,node-memwatch,这个工具不支持。
4.后来无意间在stackoverflow上发现了这个工具,https://github.com/plasma-umass/BLeak,名叫Bleak-300颗星,看起来很靠谱的样子。
但是不知道出了什么问题,我却不能正常运行它,按照它的使用说明安装下来不能启动。
这里记录一个踩坑日记,折腾了好久,联系了作者排除问题后最终发现是pip安装的mitmproxy的问题,虽然安装了,但是Bleak却无法启动它,在https://github.com/mitmproxy/mitmproxy下载了它的手动安装版本重新安装,运行之后发现完全符合要求,而且它还内置了结果分析的工具,非常方便。
在这里对于Bleak工具,再记录几点使用建议,避免再次采坑,
1.Bleak只能同一机器下局域网使用,如果你的webapp指向了一个外网的url,那么它将无法访问。
2.Bleak工具要安装google-chrome,并且要确保可以通过命令启动,不然Bleak将会报错。
3.一个loop循环必须在最后一个节点操作(比如click)之后回到第一个节点,完成一次循环。
总结:经过查找对比,目前Bleak工具是能实现自动化检测的比较好的工具,包括截取浏览器快照都能帮我们完成,不过安装和使用上,坑比较多,它可能无法立即运行。
个人觉得对于Javascript项目它是最好用的工具,当然由于我的调查并没有进行多深,可能还有很多工具我没有注意到,但是就我调查过的这些来说,如果你同样在找内存泄漏工具,Bleak是一个非常好的选择。