我试图更好地理解node.js中的内存消耗。我创建了一个小测试脚本:
所以它只有一个大的对象来跟踪,在删除它之前有5秒钟才能创建一个新对象。
记忆如何继续增长?
答案 0 :(得分:8)
也许您没有衡量最佳指标。
根据API文档页面,process.memoryUsage()
返回3个属性:
rss
heapTotal
heapUsed
http://www.nodejs.org/api/process.html#process_process_memoryusage
rss是正在使用的内存的操作系统级别度量。 node.js将懒惰地扩展其堆的最大值。根据需要堆大小(非常类似于Java)。它会增长,但永远不会缩小。这有两个原因:
释放不会在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;
行抛出语法错误,很明显存在问题。