关键字: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。

使用Chrome+node-inspector查找NodeJS内存泄漏的更多相关文章

  1. 快捷使用Node Inspector调试NodeJS

    一:介绍 NodeJS开发有很多种调试方式,比如输出Log.WebStorm自带的调试器.Node Inspector等,其中Node Inspector是比较流行和被推荐的一种. 但是Node In ...

  2. 搞不定 NodeJS 内存泄漏?先从了解垃圾回收开始

    通常来说,内存管理有两种方式,一种是手动管理,一种是自动管理. 手动管理需要开发者自己管理内存,什么时候申请内存空间,什么时候释放都需要小心处理,否则容易形成内存泄漏和指针乱飞的局面.C 语言开发是典 ...

  3. 【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码

    1.首先,java程序启动在linux,怎么生成dump文件? 1>第一步,首先你需要得到java程序的PID,最简单的方法使用如下命令 ps -ef|grep java 或者如果是docker ...

  4. 查找openssl内存泄漏(代码)

    #include <stdio.h> #include <string.h> #include <openssl/bio.h> #include <opens ...

  5. nodejs 内存泄漏

    This looks OK at first glance. We could think that theThing get's overwritten with every invocation ...

  6. 轻松排查线上Node内存泄漏问题

    I. 三种比较典型的内存泄漏 一. 闭包引用导致的泄漏 这段代码已经在很多讲解内存泄漏的地方引用了,非常经典,所以拿出来作为第一个例子,以下是泄漏代码: 'use strict'; const exp ...

  7. Chrome 浏览器垃圾回收机制与内存泄漏分析

    Chorme 浏览器中的垃圾回收和内存泄漏 垃圾回收 通常情况下,垃圾数据回收分为手动回收和自动回收两种策略. 手动回收策略,何时分配内存.何时销毁内存都是由代码控制的. 自动回收策略,产生的垃圾数据 ...

  8. Java内存泄漏分析与解决方案

    Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...

  9. 【转】如何使用MAT分析内存泄漏

    原文链接:http://www.lightskystreet.com/2015/09/01/mat_usage/ MAT - Memory Analyzer Tool 使用进阶 Sep 1, 2015 ...

随机推荐

  1. CSS完成三角形

    通过设置div的border属性,来实现! 将div的height和width属性分别设置为0px,将4边的border值设置为一样的宽度,通过调节边框的颜色课看到效果. <style> ...

  2. Linux下的权限掩码umask

    权限掩码umask 我们都知道在linux下创建一个文件或者目录之后是可以通过chmod等命令进行权限设置,来达到给当前用户.用户组用户以及其他用户分配不同的访问权限.那么,我们新创建的目录和文件本身 ...

  3. mysql 修改 character_set_database 编码格式

    操作系统:win10  x64 Server version : 5.5.46 MySQL Community Server (GPL) mysql 修改 character_set_database ...

  4. Ubuntu系统下常用的新建、删除、拷贝文件命令

    我们在Ubuntu系统中安装程序时,经常要在usr目录下新建.拷贝文件,此文件夹在Linux类系统中需要root权限才能访问,因此用常规的鼠标右键菜单操作是无效的,今天分享一下在终端中使用命令新建.拷 ...

  5. CSS之导航菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Servlet之过滤器

    Servlet的介绍: Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig Filter 程序是一个实 ...

  7. Android应用源码基于安卓的校园二手交易系统客户端+服务端+数据库

    该源码是校园二手交易系统应用带服务端,也是一个基于安卓和javaweb的校园二手交易系统,包括整套安卓客户端.javaweb服务端.mysql数据库,可以进行基本的列表显示帖子.显示帖子详情.用户注册 ...

  8. asp.net中webservice与android的json数据交互方式设置

    一 .服务器端设置 1.修改web.config 在web.config里面的的system.Web节点添加 <webServices> <protocols> <add ...

  9. Emmet的高级功能与使用技巧

    Emmet系列教程 前端开发利器Emmet的介绍 Emmet快速编写HTML代码 Emmet快速编写CSS样式 Emmet快速编写CSS样式 编写好HTML和CSS代码时,我们也需要修改或添加一些内容 ...

  10. UIView中常见的方法总结

    addSubview: 添加一个子视图到接收者并让它在最上面显示出来.- (void)addSubview:(UIView *)view[讨论]这方法同样设置了接收者为下一个视图响应对象.接收者保留视 ...