5

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

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

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

这是内存消耗的示例:

几天的内存使用情况

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

4

1 回答 1

2

你更新到最新版本了吗?

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

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

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

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

不管出于什么原因,他们都没有在名单上。(看起来很简单,我现在正在我自己的项目中尝试它是否有效,我倾向于无法正确编译任何基于 V8 的项目)

heapdump这里是一个如何指导的链接


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

也只是为了完整性(我知道你已经有了),如果有人想验证你没有在 V8 内部泄漏内存,joyent 的工程师有一篇相当不错的文章,关于如何跟踪 V8 内存泄漏

于 2013-10-21T17:16:00.757 回答