Node.js内存分配情况是什么?

21
我们正在部署一个 Node.js 应用程序。该应用程序似乎消耗了比它应该消耗的更多的 RSS 内存。因此,我们开始深入研究,并通过 process.memoryUsage(); 找到了以下信息:
  • RSS 内存迅速增长到约 400MB,并保持在 400MB-500MB 左右,波动不大(垃圾收集器在运行?)

  • heapUsed 迅速增长到 50MB,然后保持在该水平(在 20MB 和 100MB 之间)。

  • heaptotal 始终比 heapUsed 多约 30MB。

正如您所见,堆和 RSS 之间存在巨大的差异,这是我认为我们应该关注的地方。我们的堆中似乎没有什么非常重要的泄漏。
现在,在 RSS 中有什么不在堆中呢?我想是 C 扩展和缓冲区,对吗?如果是这样,我们该如何调试?还需要寻找其他的东西吗?

1
你没有说明问题。你想要实现什么目标? - Rob Raisch
2
我正在尝试了解一个Node.js应用程序所消耗的内存分配情况,特别是堆大小和RSS消耗之间存在如此大的差异的原因。 - Julien Genestoux
1
我们有这个应用程序,显然浪费了我们的资源。我们希望更好地利用它们。 - Julien Genestoux
1
我不会感到惊讶,如果在运行时可以通过节点传递参数来更改V8的RSS。 - EhevuTov
4
Node.js开发者应该更新文档,因为当前的文档(http://nodejs.org/api/process.html#process_process_memoryusage)并不清晰;没有人确切地知道rss、heapused和heaptotal代表什么。请对此进行澄清。 - Mahn
显示剩余10条评论
1个回答

3

不知道你的应用程序在做什么,很难对此发表评论。

如果V8堆使用量明显低于RSS,则必须是外部缓冲区和非V8对象使用的其他内存。

你能公开一些代码吗?


很遗憾,不是公开的。那么,RSS = 堆 + 缓冲区 + C库? - Julien Genestoux
1
@EhevuTov 我并不想限制内存使用,因为那可能会导致应用程序崩溃。我只是想知道这些内存去了哪里(以及为什么)。 - Julien Genestoux
@JulienGenestoux 我猜它是预分配内存。V8使用堆。堆相对于需要malloc()和dealloc()而言比较昂贵,因此它是预先分配的。这就是为什么我说你应该在运行时使用node --v8-options进行调整的原因。 - EhevuTov
3
有没有一种方法可以“看到”分配的缓冲区是哪些? - Julien Genestoux
@EhevuTov 这将在v8堆内产生闭包泄漏,可以通过不断增长的“heapUsed”和v8快照大小来观察到。但是,在这种情况下,“heapUsed”保持相对静态,只有“rss”在上升,这表明泄漏(如果有)不是由JS代码直接引起的,而是由本地内存(例如“Buffer”)引起的。 - Elad Nava
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接