Node.js排除内存泄漏演示

栏目: IT技术 · 发布时间: 5年前

内容简介:用于定位node内存泄漏的工具常用的有:关于Node的堆内存与堆外内存小记。

用于定位node内存泄漏的 工具 常用的有:

v8-profiler [1] node-heapdump [2] node-memwatch [3]

在演示DEMO之前可以了解点基本前置知识

关于Node的堆内存与堆外内存小记。

1. 受到V8 GC的主要是堆内存。 2. Node中的内存并非都是通过V8来进行分配的,可通过堆中的内存用量(heapUsed)总是小于进程常驻内存(rss)看出。对于那些不是通过V8来分配内存的我们称为堆外内存,比如Buffer,Buffer是基于C++的不是V8(从下面的demo中rss与external的值可以看出)。external代表 V8 管理的,绑定到 Javascript 的 C++ 对象的内存使用情况。 3. 因此表明堆外内存是可以突破内存限制问题。

Node.js排除内存泄漏演示

Node.js排除内存泄漏演示

Node.js排除内存泄漏演示

Node.js排除内存泄漏演示

使用node-heapdump排除内存泄漏的DEMO

这里主要演示node-heapdump, node-memwatch很久没有维护了。

环境安装

node.js node-gyp mac下需要安装 xcode-select --install mac下安装xcode后 sudo xcode-select --switch /Library/Developer/CommandLineTools/ node-heapdump

代码


const heapdump = require('heapdump')

const http = require('http')


const leakArray = []

const leak = function() {

leakArray.push(`leak: ${Math.random()}`)

}


http.createServer(function(req, res) {

// 每次访问node服务。都会往leakArray增加数据,并且不会回收。

leak()

res.writeHead(200, {'Content-Type': 'text/plain'})

res.end('hello node')

}).listen(9999)


console.log('server is running at: http:127.0.0.1:9999/')

然后我们通过在终通过curl不断访问服务器curl http://127.0.0.1:9999模拟用户访问,这个时候leakArray数组不断增大,并且不会被回收。

在UNIX平台上,你可以向服务器进程通发送SIGUSR2信号强制快照。


$ kill -USR2 <pid>

mac下查看pid

$ lsof -i tcp:9999

这个时候会在你的文件夹生成一个快照,文件名格式默认为:heapdump- . .heapsnapshot。

Node.js排除内存泄漏演示

由于Node是依赖V8引擎执行JavaScript的,Chrome浏览器也是,所以我们可以借助Chrome开发者工具中的Memory模块来分析这些dump文件。首先打开Chrome的开发者工具,切换到Memory,并依次加载dump文件。

Node.js排除内存泄漏演示

关于Summary这个选项,从图中可以看出它有Constructor、Distance、Shallow Size、Retained Size共4项。Constructor这列是用类名对变量进行分组;Distance表示和根对象的距离,越小表示和根对象越近;Shallow Size表示变量自身的大小,不包含它引用的变量的大小;Retained Size不仅包含自身的大小,还包含了引用的变量的大小。

从图中可以看出,(string)那一行的Shallow Size和Retained Size都占据了100%的内存。

我们直接查看distance(20)最远的那一行。

Node.js排除内存泄漏演示

然后我们详情看下leak()。

Node.js排除内存泄漏演示

当你再详细查看leakArray你就发现这里存储了大量的leak字符串,它们一直未得到回收。

Node.js排除内存泄漏演示

参考资料

深入浅出node.js

PS:感兴趣的可以关注下公众号。

Node.js排除内存泄漏演示

References

[1] v8-profiler:  https://github.com/node-inspector/v8-profiler

[2] node-heapdump:  https://github.com/bnoordhuis/node-heapdump

[3] node-memwatch:  https://github.com/lloyd/node-memwatch


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithm Design

Algorithm Design

Jon Kleinberg、Éva Tardos / Addison-Wesley / 2005-3-26 / USD 144.20

Algorithm Design introduces algorithms by looking at the real-world problems that motivate them. The book teaches students a range of design and analysis techniques for problems that arise in compu......一起来看看 《Algorithm Design》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具