關鍵字:NodeJS, 內存泄漏,node-inspector,Chrome
OS:Windows 10
本文介紹如何使用node-inspector+Chrome查找nodejs內存泄漏。
1.創建一個Express app, 參考http://www.cnblogs.com/ldlchina/p/4054974.html。
修改app.js內容如下:
//app.js var app = require('express')(); var http = require('http').Server(app); var leakobjs = []; function LeakClass(){ this.x = 1; } app.get('/', function(req, res){ console.log('get /'); for(var i = 0; i < 1000; i++){ leakobjs.push(new LeakClass()); } res.send('<h1>Hello world</h1>'); }); http.listen(3000, function(){ console.log('listening on port 3000'); });
運行cmd:”node app.js“
在Chrome里面打開頁面:http://localhost:3000/。不停的刷新給頁面,nodejs的內存將不停的增長。
2.安裝使用node-inspector來調試后台程序。請參考http://www.cnblogs.com/ldlchina/p/3551277.html。
運行cmd: "node --debug app.js"。
運行cmd: "node-inspector"。
3.在Chrome里面打開http://127.0.0.1:8080/debug?port=5858, 如下圖:
4.選擇”Profiles“標簽,選擇”Take Heap Snapshot“,點擊”Take Snapshot“。如下圖
5.打開一個新的Chrome頁面,運行http://localhost:3000/。
6.再次選擇”Profiles“標簽,選擇”Take Heap Snapshot“,點擊”Take Snapshot“。
選擇Comparison,你將看到”LeakClass“導致了內存的增長,如下圖。這樣我們可以檢查代碼中關於LeakClass的部分,經驗告訴我們要避免不限制的增長數組,否則在大訪問量的情況下內存會耗光。
內存泄露定位工具
現在已經有許多好用且不斷增強的工具用於定位Node.js應用的內存泄露。下面是其中的一些:
- https://github.com/lloyd/node-memwatch。注:如果”node install memwatch“安裝失敗,那就試試”node install memwatch-next“
- Jimb Esser的node-mtrace,它使用了GCC的mtrace工具來分析堆的使用。
- Dave Pacheco的node-heap-dump對V8的堆抓取了一張快照並把所有的東西序列化進一個巨大的JSON文件。它還包含了一些分析研究快照結果的JavaScript工具。
- Danny Coates的v8-profiler和node-inspector提供了綁定在Node中的V8分析器和一個基於WebKit Web Inspector的debug界面。
更多內容請參考:
Memory leak patterns in JavaScript。