首页 > 解决方案 > NodeJS 内存占用和 OOM

问题描述

我正在运行一个小型 nodejs 应用程序并开始为其中一个操作收到 OOM 错误:

第 0 行中的致命错误

进程内存不足后返回 API 致命错误处理程序

失败消息对象:0x7f0e269659b0

我进行了内存转储,在错误打印到控制台之前和之后,它们的大小约为 26MB。我的进程内存使用量(Ubuntu是主机)也不是那么高:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                              
21069 ashley    20   0 1185368  39584  24616 S   0.0  0.2   0:00.70 node   

如果我正确解释此输出,则节点进程使用的驻留内存少于 40MB。基本上没有内存泄漏或类似的东西。根据 google,Ubuntu 上节点进程的默认内存为 1.7GB。现在,我很困惑为什么我的进程会失败,为什么节点进程会占用这么多内存。根据我发现大多数人只是使用 --max-old-space-size 标志增加节点可用的内存。如果这是解决方案,我真的很困惑为什么 node 如此需要内存,使用 springboot 用 java 编写的类似应用程序很可能会在仅 256-512MB 内存的情况下表现出色。

而且,如果 nodejs VM 实例至少需要 2-3GB 的内存,这使得 node 微服务在云成本方面比 java 贵得多。

我仍然希望我的 NodeJS 知识存在差距,并且我的简单节点应用程序可以安装到只有 512MB-1GB 微型 VM 的 VM 中。

我将不胜感激任何想法,链接,建议。

非常感谢!

标签: node.jsmicroservices

解决方案


该错误是由于传递了不正确的值(对象而不是 Sequelize 的原始值)导致内存泄漏。通过查看内存转储检测到问题。


推荐阅读