node.js尽pipe堆大小相当一致,但RSS内存随着时间的推移而增长

我有一个node.js应用程序,尽pipeheapUsed / heapTotal保持相对稳定,RSS内存的使用似乎仍然在增长。

下面是一个星期内(从process.memoryUsage() )获取的三次记忆测量的图表:

内存图

您可能会注意到,有一个有点循环的模式 – 这与每天的应用程序的活动相对应。

实际上在堆中似乎有轻微的增长,尽pipe远不及RSS的增长。 所以我一直在使用堆转储(使用node-heapdump),并使用Chrome的堆比较function来查找泄漏。
一个这样的比较可能看起来像以下(按大小增量按降序排列):

堆转储

实际显示的内容取决于何时拍摄快照(例如,有时会分配更多的缓冲区对象等) – 在这里,我试图拿出一个最能说明问题的示例。

首先要注意的是左侧的大小(203MB vs 345MB)远远高于图中显示的堆大小。 其次,大小差异明显不符合142MB的差异。 实际上,按大小三angular形按升序sorting,多个对象被释放 ,这意味着堆应该更小!

有没有人有任何想法:

  • 这是为什么呢? (RSS不断增长,堆大小稳定)
  • 我怎么能阻止这种情况的发生,而不是重新启动服务器时不时?

其他详情:
节点版本:0.10.28
操作系统:Ubuntu 12.04,64位

更新:正在使用的模块列表:

  • asynchronous v0.2.6
  • log4js v0.6.2
  • mysql v2.0.0-alpha7
  • nodemailer v0.4.4
  • 节点时间 v0.9.2(对于时区信息,不要与节点时间混淆)
  • sockjs v0.3.8
  • 下划线 v1.4.4
  • 用法 v0.3.9(用于CPU统计,不用于内存使用)
  • webkit-devtools-agent v0.2.3(已加载但未激活)
    堆转储时,加载heapdump v0.2.0。

谢谢阅读。

您看到RSS使用率和堆使用率之间的差异是缓冲区。

“缓冲区类似于整数数组,但对应于V8堆外的原始内存分配” https://nodejs.org/api/buffer.html#buffer_buffer