尽管堆大小相当一致,node.js RSS 内存会随着时间增长

标签 node.js memory-leaks

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

这是一周内进行的三个内存测量的图表(来自 process.memoryUsage()):

memory graph

您可能会注意到存在某种周期性模式 - 这与应用程序每天的事件相对应。

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

heap dump

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

首先要注意的是左侧的大小(203MB 与 345MB)比图中显示的堆大小高得多。其次,大小增量显然与 142MB 的差异不匹配。事实上,按 size delta 升序排序,很多对象已经deallocated,这意味着堆应该更小!

有没有人知道:

  • 为什么会这样? (RSS 不断增长,堆大小稳定)
  • 如果不时不时重启服务器,我该如何阻止这种情况发生?

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

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

感谢阅读。

最佳答案

您看到的 RSS 使用和堆使用之间的区别在于缓冲区。

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

关于尽管堆大小相当一致,node.js RSS 内存会随着时间增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481519/

相关文章:

node.js - 如何使用 passport-jwt 验证路由?

javascript - 使用 promise 而不是回调

linux - 在没有可用页面的情况下终止进程后分配的页面会变成什么?

node.js - React 服务端渲染时使用 process.env

javascript - 用于验证 UTF-8 的正则表达式仅包含 "normal"个字符

node.js - 云函数: TypeError: Cannot read property 'auth' of undefined

Delphi:使用 [weak] 属性的对象聚合和内存泄漏

c - valgrind 给出大小为 1 的无效读取

javascript - 可能的node.js内存过度使用w/express服务器和pm2

ios - 如何使用 __block 和完成 block 避免内存泄漏