我正试图更好地了解node.js中的内存消耗
- 每秒:记录当前内存消耗
- 5秒后:每10秒:创建一个大JS对象
- 10秒后:每10秒:删除那个大JS对象
这是脚本。
因此,它只需要跟踪一个大对象,从删除它到创建新对象还有5秒钟的时间。
为什么记忆一直在增长?
也许您没有衡量最佳指标。
根据API文档页面,process.memoryUsage()
返回3个属性:
rss
heapTotal
heapUsed
http://www.nodejs.org/api/process.html#process_process_memoryusage
rss是操作系统级别的内存度量。node.js会根据需要将其堆扩展到最大堆大小(与Java非常相似)。它生长,但从不萎缩。这是可以的,有两个原因:
- 节点内部管理其内存
- 垃圾收集器最终释放未引用对象使用的内存
- 堆的大小有上限。我知道它在某个时候是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;
行抛出语法错误,从而清楚地表明存在问题。