gpt4 book ai didi

node.js - 为什么nodejs内存在这个测试中一直在增长?

转载 作者:搜寻专家 更新时间:2023-10-31 23:28:47 25 4
gpt4 key购买 nike

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

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

Here is the script .

所以它只有一个大对象需要跟踪,并且在删除它之间有 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. Node 在内部管理它的内存
  2. 垃圾收集器最终释放未引用对象使用的内存。
  3. 堆的大小有一个上限。我知道它在某个时候是 1.4 GB,但这可能不再准确了。抱歉,我不是最新的 Node 详细信息。

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

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

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

如果您的目标是避免 Node 进程因操作系统拒绝其内存而耗尽内存,那么从技术上讲 rss 是正确的指标,但我认为它对您没有帮助。这不是泄漏。您根本没有 1.4 GB(或任何当前限制)的内存可用于该进程。盒子本身动力不足,或者您配置了资源限制(例如 Linux 系统上的 ulimit)。

长话短说

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

关于node.js - 为什么nodejs内存在这个测试中一直在增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20842730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com