在使用appium的过程中,发现有内存泄露,最后就process out of memory了,就挂了
网上用使用增加运行内存的方式(还是抗不住),没办法,就只好找出内存泄露的地方了
对node.js很多文章,都是说用memwatch,结果发现,这个是一个死项目,有四年没有更新过了,在现有的环境下,是没有办法编译的。
然后又有一个memwatch-next,顾名思义,就是memwatch的下一个版本,结果是果然也可以编译,一些事件也支持,但是要headdump后要end后,就挂了。
国内,也只有这么多了,用百度,你一万年都别想解决问题,估计找成人不宜的东西,百度世界第一名,google也不比过百度。
只好翻出去,有人说到node-headdump,然后,就可以用了。
首先它有C++的部分,所以需要安装C++编译环境
1.安装node-gpy
cmd>npm install -g node-gyp
2.安装python 2.7.x
安装过程,默认就可以了
如果你有装多个python,如3.x,运行的时候,需要指定python 2.7
cmd>node-gyp --python /path/to/python2.7
然后配置python环境
cmd>npm config set python python2.7
强烈要求,不要用3.x,只用2.7.x就可以了
为什么?因为2.7.x比3.x成熟,另外3.x和2.x差别太大了,很难兼容。
3.安装windows编译工具
在windows的cmd下(需管理员权限)
npm install --global --production windows-build-tools
4.安装C++编译器
有两个选择,
一个是Visual C++ Build Tools ,地址:http://landinghub.visualstudio.com/visual-cpp-build-tools
这是一个独立的编译和库(有2015,2017两个版本,随便选一个,我建议2015,因为2017还不知道有什么问题)
另一个是安装vs2015 最新版本是vs2015 up3了 用搜索一下,就可以找到安装文件
安装完成后,配置环境:
cmd>npm config set msvs_version 2015
有了上面四步:node-heapdump的编译环境就OK了
5.安装node-heapdump
在你项目所在目录,执行命令
cmd>npm install heapdump
我的环境是node 6.9.x 所以用最新版本就可以了
下面,我们就来使用heapdump
首先引用heapdump
import heapdump from "heapdump";
function showMemory() {
function f(v) {
if (v < 1024) return v.toString(10);
else if (v < 1048576) { //1M
return (v / 1024).toFixed(2) + "KB";
}
else if (v < 1073741824) //1M
{
return (v / 1048576).toFixed(2) + "MB";
}
else {
return (v / 1073741824).toFixed(2) + "GB"; //1G
}
}
{
//打印并显示当前堆的情况 可以去掉这个部分
let d = process.memoryUsage();
let strRss = f(d.rss);
let strheapTotal = f(d.heapTotal);
let strheapUsed = f(d.heapUsed);
let strDate = new Date().toLocaleString();
console.log(`memory: ${strDate}: rss:${strRss}, heapTotal:${strheapTotal}, heapUsed:${strheapUsed}`, );
}
heapdump.writeSnapshot('d:/tmp/dump/' + Date.now() + '.heapsnapshot'); //堆快照必须.heapsnapshot,否则在后面使用chrome的时候,会报错。
}
setInterval(showMemory, 5000); //这里设定了,每5秒打印一次。
然后就可以运行了。
在得到很多heapsnapshot后,再用chrome浏览器,按F12,进入开发模式
然后如下图所示操作,将相邻的几个快照依次加载
加载后,处理方式有四种,分别是summary,comparison,cotainment,statistics,这里,我选择comparison,就能看到当前内存快照和上一个内存快照的差异。