为什么nodejs内存在这次测试中不断增长



我正试图更好地了解node.js中的内存消耗

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

这是脚本。

因此,它只需要跟踪一个大对象,从删除它到创建新对象还有5秒钟的时间。

为什么记忆一直在增长?

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

根据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,但这可能不再准确了。很抱歉,我没有更新节点的这些详细信息

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

如果您测量的是heapUsed属性而不是rss,您应该看到它在分配对象时上升,在GC运行时下降。

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

如果您的目标是避免操作系统拒绝节点进程内存,从而导致节点进程内存不足,那么从技术上讲,rss是正确的度量标准,但我认为它对您没有帮助。这不是泄漏。您根本没有1.4GB(或当前的限制)的内存可供进程使用。要么是盒子本身动力不足,要么是配置了资源约束(比如Linux系统上的ulimit)。

TL;DR

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

delete candles;不起作用。delete删除属性,而candles不是属性。用candles = []切换

从MDN:上的删除文档

删除仅对对象的属性有效。它对变量或函数名没有影响。

您的delete candles调用不会执行任何操作。例如,如果您添加console.log(candles.length);,您可以看到它继续不断增长。

您应该将delete candles替换为candles = [];以清除所有蜡烛。请注意,最好考虑在文件顶部预写"use strict";,以严格模式编写代码。这将导致delete candles;行抛出语法错误,从而清楚地表明存在问题。

最新更新