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

时间:2013-12-30 15:45:47

标签: node.js memory memory-leaks

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

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

Here is the script

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

记忆如何继续增长?

3 个答案:

答案 0 :(得分:8)

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

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

  1. rss
  2. heapTotal
  3. heapUsed
  4. http://www.nodejs.org/api/process.html#process_process_memoryusage

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

    1. 节点在内部管理其内存
    2. 垃圾收集器最终释放未引用对象使用的内存。
    3. 堆上有一个上限。我知道它在某些时候是1.4 GB,但这可能不再准确。对不起,我不了解节点的这些细节。
    4. 释放不会在OS分配器级别释放,而只是将节点(实际上是V8)内存管理器中的内存标记为可用于其他对象。

      如果您测量的是heapUsed属性而不是rss,那么当GC运行时,您应该会看到它被分配和关闭。

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

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

      TL; DR

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

答案 1 :(得分:3)

delete candles;不起作用。 delete删除属性,candles不是一个。用candles = []

切换它

答案 2 :(得分:3)

来自MDN上的delete docs

  

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

您的delete candles电话无效。例如,如果您添加console.log(candles.length);,则可以看到它继续不断增长。

您应该将delete candles替换为candles = [];以清除所有蜡烛。请注意,考虑通过将"use strict";添加到文件顶部,以严格模式编写代码是个不错的主意。这会导致您的delete candles;行抛出语法错误,很明显存在问题。