使用Chrome+node-inspector查找NodeJS内存泄漏

关键字: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-profilernode-inspector提供了绑定在Node中的V8分析器和一个基于WebKit Web Inspector的debug界面。

 

更多内容请参考:

Memory leak patterns in JavaScript。

The node.js Profiling Guide that Hasn’t Existed - Finding The Cause of a Memory Leak Using Heap Snapshots。

 

posted @ 2015-08-26 23:48  Ldlchina  阅读(7876)  评论(0编辑  收藏  举报