Node.js排除内存泄漏演示

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

内容简介:用于定位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


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

查看所有标签

猜你喜欢:

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

规划算法

规划算法

拉瓦利 / 2011-1 / 99.00元

《规划算法》内容简介:规划是人类智慧的结晶,规划问题广泛地存在于人们的日常工作和生活中。现在,规划已涉及计算机科学、人工智能、力学、机械学、控制论、对策论、概率论、图论、拓扑学、微分几何、代数几何等许多现代科学领域。《规划算法》是作者多年来教学和科研工作的总结,系统地介绍了规划领域中的基础知识和最新成果。作者将三个相对独立的学科:机器人学、人工智能和控制论巧妙地结合在一起。《规划算法》给出了大量内......一起来看看 《规划算法》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具