在 node.js 进程中跟踪本机内存泄漏的一些有效策略是什么?

Jas*_*run 5 memory-leaks node.js

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

该进程似乎是一个级别堆,但随着时间的推移,node.js 进程的 RSS 缓慢增长。该进程是一个作业处理程序,它一遍又一遍地为不同的参数运行相同类型的作业。进程的 RSS 的增长与绘制作业运行的累积数量的线具有相同的形状,因此每个作业运行都会以某种方式泄漏一点内存。

由于堆或多或少是恒定的,标准堆检查工具似乎没有多大帮助。

以下是内存消耗情况的示例:

几天的内存使用情况

当前在节点 0.8.7 上运行。每个作业都会执行一些数据库读/写操作,与一个 redis 实例进行通信,并使用 mikael/request 执行一些 Web 请求。

小智 2

您更新到最新版本了吗?

我知道每个人都这么说:),当我认为自己遇到问题时,我只是觉得我应该加入每两周在生产服务器上更新我的 Node.js 版本的行列。听起来是个好主意不是吗?

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

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

如果您有兴趣跟踪运行时内部泄漏的对象(我指的是 javascript 对象、函数等),mozilla 有一篇非常完整的关于跟踪内存泄漏的博客文章以及一些可用于以下项目的链接:做这个。

但出于某种原因,他们没有将这个列入名单。(看起来很简单,我现在正在自己的项目中尝试一下,看看它是否有效,我倾向于无法正确编译任何基于 V8 的项目)

heapdump这里是如何指导的链接


根据我自己的经验,V8 引擎似乎会分配内存,并保留它,以防以后需要完全相同的内存块。我的兄弟已经大量使用 Node.js 大约 3 年了,他也看到了同样的事情。

另外,为了完整起见(我知道你已经这样做了),如果有人想验证你没有在 V8 内部泄漏内存,来自 Joyent 的一位工程师有一篇相当不错的文章,介绍了如何跟踪 V8 内存泄漏