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


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

查看所有标签

猜你喜欢:

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

HotSpot实战

HotSpot实战

陈涛 / 人民邮电出版社 / 2014-3 / 69

《HotSpot实战》深入浅出地讲解了HotSpot虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器的设计演进、CMS和G......一起来看看 《HotSpot实战》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具