node.js - 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 中。
我将不胜感激任何想法,链接,建议。
非常感谢!
解决方案
该错误是由于传递了不正确的值(对象而不是 Sequelize 的原始值)导致内存泄漏。通过查看内存转储检测到问题。
推荐阅读
- kubernetes - k8s 中的 pods\containers 是否有默认内存请求和\或限制?
- glsl - 如何在 GLSL 中使用 Vulkan SPIR-V 数据格式
- firebase - FlutterFirebaseCorePlugin.java 使用或覆盖已弃用的 API
- java - MapStruct 转换错误不兼容类型:无法转换为
- survival-analysis - 精算与预测生存比较
- html - A4 尺寸的 HTML div 大于 A4
- html - 如果添加 {{ end }},则 html 文件将无法工作
- sqlite - 在 Flutter 中导入现有的 Sqlite 数据库
- database - 无法将 Firebase 库添加到 Apps 脚本
- angular - 如何仅在移动 Angular 上显示汉堡菜单?