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

时间:2014-06-30 00:29:36

标签: node.js memory-leaks

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

以下是一周(从process.memoryUsage())开始的三次内存测量的图表:

memory graph

您可能会注意到有一些周期性的模式 - 这与应用程序每天的活动相对应。

实际上,堆中似乎确实略有增长,尽管它远不及RSS增长。所以我不时地使用堆转储(使用node-heapdump),并使用Chrome的堆比较功能来查找泄漏。
一个这样的比较可能如下所示(按大小增量按降序排序):

heap dump

实际显示的内容取决于拍摄快照的时间(例如,有时会分配更多的缓冲区对象等) - 这里我试图采用最能说明问题的样本。

首先要注意的是左侧的尺寸(203MB对345MB)远远高于图中显示的堆尺寸。其次,大小增量显然与142MB的差异不匹配。事实上,按大小增量按升序排序,许多对象已被解除分配,这意味着堆应该更小!

有没有人知道:

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

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

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

感谢阅读。

1 个答案:

答案 0 :(得分:2)

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

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