我有一个 node.js 应用程序,尽管 heapUsed/heapTotal 保持相对恒定,但 RSS 内存使用似乎一直在增长。
这是一周内进行的三个内存测量的图表(来自 process.memoryUsage()
):
您可能会注意到存在某种周期性模式 - 这与应用程序每天的事件相对应。
堆实际上似乎确实有轻微的增长,尽管远不及 RSS 的增长。所以我一直在不时地进行堆转储(使用 node-heapdump),并使用 Chrome 的堆比较功能来查找泄漏。
一个这样的比较可能如下所示(按大小增量降序排列):
实际显示的内容取决于拍摄快照的时间(例如,有时会分配更多的 Buffer 对象等)- 在这里,我尝试采用最能说明问题的示例。
首先要注意的是左侧的大小(203MB 与 345MB)比图中显示的堆大小高得多。其次,大小增量显然与 142MB 的差异不匹配。事实上,按 size delta 升序排序,很多对象已经deallocated,这意味着堆应该更小!
有没有人知道:
- 为什么会这样? (RSS 不断增长,堆大小稳定)
- 如果不时不时重启服务器,我该如何阻止这种情况发生?
其他细节:
Node 版本:0.10.28
操作系统:Ubuntu 12.04,64 位
更新:正在使用的模块列表:
- async v0.2.6
- log4js v0.6.2
- mysql v2.0.0-alpha7
- nodemailer v0.4.4
- node-time v0.9.2(用于时区信息,不要与 Node 时间混淆)
- sockjs v0.3.8
- underscore v1.4.4
- usage v0.3.9(用于 CPU 统计信息,不用于内存使用情况)
- webkit-devtools-agent v0.2.3(已加载但未激活)
heapdump转储时加载 v0.2.0。
感谢阅读。
最佳答案
您看到的 RSS 使用和堆使用之间的区别在于缓冲区。
“Buffer 类似于整数数组,但对应于 V8 堆之外的原始内存分配” https://nodejs.org/api/buffer.html#buffer_buffer
关于尽管堆大小相当一致,node.js RSS 内存会随着时间增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481519/