NodeJs内存泄漏与检测

时间 : 14-10-06 评论 : 0 点击 : 2,249 次

在浏览器中写js代码不用太关注内存泄漏的问题,NodeJs中写js代码却必须考虑内存泄漏问题,作为长期运行的服务器进程,如果存在内存泄漏会越积越多,导致内存占用越来越多,运行越来越慢,最终超过内存限制,导致进程出错。

严格意义上讲内存泄漏指的是内存地址已没有指针指向它,没有任何办法可以引用到这块内存,这块内存没有得到释放,也没办法使用。在本文中,泛指内存没有及时得到回收为内存泄漏。

缓存

服务器中使用缓存来提高效率是常用的方法,如果在js中使用变量缓存代码,没有使用淘汰策略就会导致缓存越积越多,最终超过内存限制。解决办法:1、缓存淘汰机制,限制缓存的大小,不让缓存无限增长。最简单的缓存淘汰机制就是现在总大小,超过大小之后就淘汰老缓存。2、使用外部缓存,如memcache。

队列

js中广泛使用的事件机制使用队列来实现,事件发生时,产生一个事件插入到队列中,每个tick中取出事件进行处理。当处理事件的速度低于产生事件的速度时,会导致队列越积越多,占用内存越来越多,最终导致进程出错。解决方案,监控和限制队列长度: 1、超时机制,超时的事件扔掉 2、拒绝模式,当队列长度大于指定值时,拒绝往队列中插入更多事件

闭包

/后续补充/

内存泄漏排查

node-heapdump:可通过npm安装,npm install heapdump,用require('heapdump')引入,运行一段时间后,通过发送信号,kill -USR2 让heapdump抓取内存快照,将会得到一个文件,通过chrome的控制台profiles打开该文件,分析内存使用情况。

node-memwatch:每次进行全堆垃圾回收时,会触发一次stats事件,这个事件中可以打印一些内存统计信息,经过连续5次垃圾回收之后,内存仍然没有得到释放,则会触发一个leak事件,memwatch提供内存快照抓取与比较工具。

javascript

NodeJs内存泄漏与检测:等您坐沙发呢!

发表评论