我有一个NodeJS服务器运行在一个具有256MB RAM的小型VM上,我注意到随着服务器接收新请求,内存使用量不断增长。我读到小环境中的一个问题是Node不知道内存约束,因此直到很久以后才尝试垃圾收集(例如,也许它只希望在达到512MB的已用RAM时才开始垃圾收集),这是真的吗?
我也尝试使用各种标志,如--max-old-space-size
,但没有看到太大的变化,所以我不确定我是否有一个实际的内存泄漏,或者如果节点只是不GC尽快?
这可能不是一个完整的答案,但它来自经验,可能提供一些指导。NodeJS中的内存泄漏是大多数开发人员所面临的最具挑战性的错误之一。
但是在我们讨论内存泄漏之前,回答您的问题—除非您显式地配置--max-old-space-size
,否则会有默认的内存限制。由于节点中垃圾收集的某些阶段是昂贵的/阻塞的,这取决于可用内存的多少,它将延迟一些昂贵的GC周期(例如标记-清除收集)。我看到,在一个拥有16gb内存的进程中,在发生重大垃圾收集之前,它很容易让内存达到800mb。但我确信这不会使~ 800mb成为任何特殊限制。这实际上取决于正在运行的进程有多少可用内存节点以及正在运行的应用程序类型。例如,如果你有一些复杂的计算,缓存(例如大数据库连接池)或有bug的日志库,它们本身总是占用高内存,这是完全可能的。
如果你正在监控你的NodeJs的内存占用-在服务器启动后的某个时候,一切都开始升温(express加载所有模块并创建一些启动对象,缓存升温并且所有高内存消耗模块都变得活跃),它可能看起来好像有内存泄漏,因为内存会不断攀升,有时高达~ 1gb。然后您会看到它稳定下来了(这个限制在<v8版本中比较小)。>
但是有时确实存在内存泄漏(如果没有特定的模式,可能很难发现)。
在你的情况下,256 MB似乎只满足最小的RAM
要求的nodejs,可能还不够。在您开始担心内存泄漏之前,您可能希望将其提高到1.5 GB,然后监视所有内容。
关于NodeJS的内存模型和内存泄漏的一些好资源
- Node.js Under the Hood
- NodeJS内存泄漏
- 垃圾收集可以在主线程运行时发生吗忙吗?
- 理解和调试Node.js应用程序中的内存泄漏
帮助发现内存泄漏的一些调试工具
-
节点检查器|Chrome
-
llnode
-
gcore