我在一个拥有256 VM内存的小型VM上运行了一个NodeJS服务器,并且我注意到,随着服务器接收到新的请求,内存使用量不断增加。我读到,小型环境的一个问题是Node不知道内存约束,因此直到很久以后才尝试垃圾收集(例如,它可能只想在达到512 it的已使用RAM时才开始垃圾收集),真的是这样吗?
我也尝试使用各种标志,如--max-old-space-size,但没有看到太多的变化,所以我不确定我是否有实际的内存泄漏,还是Node只是没有尽快GC?
发布于 2022-07-17 06:50:13
这可能不是一个完整的答案,但它来自于经验,并可能提供一些指点。NodeJS中的内存泄漏是大多数开发人员可能面临的最具挑战性的错误之一。
但在讨论内存泄漏之前,要回答您的问题--除非您显式地配置--max-old-space-size,否则就会有默认的内存限制。由于节点中的垃圾收集的某些阶段是昂贵的(有时是阻塞的)步骤,这取决于其可用内存的大小,因此它会延迟(例如,标记扫描收集)一些昂贵的GC周期。我已经看到,在一个拥有16 GB内存的机器中,它很容易让内存达到800 MB,然后才会发生重要的垃圾收集。但我相信这并不意味着800 MB的特别限制。这将真正取决于它有多少可用内存,以及您正在运行的应用程序类型。例如,如果您有一些复杂的计算、缓存(例如大DB连接池)或buggy日志库,它们本身总是占用很高的内存,这是完全可能的。
如果您正在监视NodeJs的内存占用(在服务器启动后的某个时间),所有的东西都会开始升温(快速加载所有模块并创建一些启动对象、缓存预热以及所有高内存消耗模块都处于活动状态),可能会出现内存泄漏的情况,因为内存会不断上升,有时甚至高达1GB。然后,您将看到它稳定下来(在
但有时会有实际的内存泄漏(如果没有具体的模式,就很难发现)。
在您的示例中,256 MB似乎只满足nodejs的最低RAM要求,可能还不够。在开始担心内存泄漏之前,您可能需要将其压缩到1.5GB,然后监视所有内容。
关于NodeJS的内存模型和内存泄漏的一些好资源。
一些帮助识别内存泄漏的调试工具
https://stackoverflow.com/questions/73009144
复制相似问题