在使用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,就能看到當前內存快照和上一個內存快照的差異。
