为什么nodejs内存在这个测试中继续增长?

ask*_*ike 3 memory memory-leaks node.js

我试图更好地了解node.js中的内存消耗.我创建了一个小测试脚本:

  • 每秒:记录当前的内存消耗
  • 5秒后:每10秒:创建一个大的JS对象
  • 10秒后:每10秒:删除那个大JS对象

这是脚本.

所以它只有一个大的对象来跟踪,在删除它之前有5秒钟才能创建一个新对象.

记忆如何继续增长?

Bra*_*don 8

也许您没有衡量最佳指标.

根据API文档页面,process.memoryUsage()返回3个属性:

  1. rss
  2. heapTotal
  3. heapUsed

http://www.nodejs.org/api/process.html#process_process_memoryusage

rss是正在使用的内存的操作系统级别度量.node.js将懒惰地扩展其堆的最大值.根据需要堆大小(非常类似于Java).它会增长,但永远不会缩小.这有两个原因:

  1. 节点在内部管理其内存
  2. 垃圾收集器最终释放未引用对象使用的内存.
  3. 堆上有一个上限.我知道它在某些时候是1.4 GB,但这可能不再准确.对不起,我不了解节点的这些细节.

释放不会在OS分配器级别释放,而只是将节点(实际上是V8)内存管理器中的内存标记为可用于其他对象.

如果您测量heapUsed属性而不是rss,则应该看到它在GC运行时分配和关闭对象时上升.

如果您的目标是避免代码耗尽堆空间,那么该指标正是您所需要的.

如果您的目标是避免由于操作系统拒绝内存而导致节点进程耗尽内存,那么技术上rss是正确的度量标准,但我认为它不会对您有所帮助.这不是泄漏.您根本没有可用于内存的1.4 GB(或任何当前限制)内存.框本身功能不足或者您具有已配置的资源约束(如Linux系统上的ulimit).

TL; DR

如果您担心由于内存未被回收而导致JavaScript代码中的新对象创建失败,那么这heapUsed是正确的捕获指标.如果您担心操作系统拒绝为节点进程提供更多内存,那么您要么没有足够的内存,要么软件设置会阻止更多内存.