什么是一些有效的策略来追踪node.js进程中的本地内存泄漏?

我一直在试图追踪node.js应用程序中一个非常缓慢,但持久的原生内存泄漏,而且我已经用完了策略。

这个过程似乎是一个层次堆,但随着时间和date的推移,node.js过程的RSS进程缓慢增长。 这个过程是一个作业处理程序,一次又一次地为不同的参数运行相同types的作业。 这个过程的RSS的增长与绘制作业运行的累积数量的线条形状相同,因此每个作业运行都会以某种方式泄露一些内存。

由于堆或多或less不变,标准的堆检查工具似乎没有多大的帮助。

下面是内存消耗的例子:

内存使用了几天

目前在节点0.8.7上运行。 每个作业执行一定数量的数据库读/写操作,与redis实例通信,并使用mikael / request执行一些web请求。

你有更新到最新的版本?

我知道每个人都这样说:),我觉得我应该每两周在我的生产服务器上join更新我的node.js版本的乐队,当时我觉得我有一个问题。 听起来不错,不是吗?

所以我一直在想同样的事情,我有几个node.js项目,现在我已经pipe理了几个月(也是我去年写的)。 V8引擎或我的节点应用程序似乎非常缓慢地消耗内存,永远不会释放它。 (它足够慢,我只需要不时地重新启动它们)

这是非常紧张的,特别是考虑到它应该释放RSS内存,或者最终达到峰值。

如果你有兴趣跟踪在运行时内部泄露的对象 (我的意思是JavaScript对象,函数等),mozilla有一个非常完整的博客文章追踪内存泄漏和一些项目的链接,可以用来做这个。

因为什么原因,他们没有列在名单上。 (这似乎很简单,我现在试着在我自己的项目上看看它是否工作,我倾向于没有得到任何基于V8的编译正确)

heapdump , 这里是一个如何引导的链接 。


从我自己的经验来看,V8引擎似乎分配内存,并坚持它只是后来需要完全相同的内存块。 另外我的兄弟已经使用Node.js大约3年了也看到了同样的事情。

也只是为了完整性(我知道你已经有了), 如果有人想validation你是不是在V8内部泄漏内存 ,joyent的工程师有一个相当不错的logging如何跟踪V8内存泄漏 。