Node 何时进行垃圾收集?

问题描述 投票:0回答:1

我有一个 NodeJS 服务器在一个具有 256MB RAM 的小型虚拟机上运行,我注意到随着服务器收到新请求,内存使用量不断增长。我读到,小型环境中的一个问题是 Node 不知道内存限制,因此直到很久以后才尝试垃圾收集(例如,也许它只想在达到 512MB 时才开始垃圾收集)使用RAM),真的是这样吗?

我还尝试使用各种标志,例如

--max-old-space-size
,但没有看到太多变化,所以我不确定是否存在实际内存泄漏,或者 Node 是否不尽快进行 GC?

node.js memory-management
1个回答
4
投票

这可能不是一个完整的答案,但它来自经验,可能会提供一些指导。 NodeJS 中的内存泄漏是大多数开发人员遇到的最具挑战性的错误之一。

但在我们讨论内存泄漏之前,先回答你的问题 - 除非你显式配置

--max-old-space-size
,否则默认内存限制将取代。由于节点中垃圾收集的某些阶段是昂贵的/阻塞的,根据可用内存的大小,它会延迟一些昂贵的 GC 周期(例如标记-清除收集)。我发现,在具有 16 GB 内存的进程中,在发生大量垃圾收集之前,内存很容易高达 800 MB。但我确信这不会对 800 MB 造成任何特殊限制。这实际上取决于运行进程有多少可用内存节点以及您正在运行什么类型的应用程序。例如。如果您有一些复杂的计算、缓存(例如大型数据库连接池)或有缺陷的日志库,那么它们本身就总是占用大量内存,这是完全有可能的。

如果您正在监视 NodeJ 的内存占用量 - 在服务器启动后的某个时间,一切都开始预热(快速加载所有模块并创建一些启动对象,缓存预热并且所有高内存消耗模块都变为活动状态) ,可能看起来好像存在内存泄漏,因为内存会不断攀升,有时高达 ~1 GB。然后你会看到它稳定下来(这个限制在 中曾经较小)

但有时确实存在内存泄漏(如果没有特定模式,可能很难发现)。

就您而言,256 MB 似乎仅满足 Nodejs 的最低

RAM
要求,但可能还不够。在您开始担心内存泄漏之前,您可能希望将其增加到 1.5 GB,然后监视所有内容。

关于 NodeJS 内存模型和内存泄漏的一些好资源。

一些调试工具可以帮助发现内存泄漏

© www.soinside.com 2019 - 2024. All rights reserved.